编辑 - 自 2015 年 7 月 23 日起
official postgres docker image 将运行在/docker-entrypoint-initdb.d/ 文件夹中找到的.sql 脚本。
所以你只需要创建以下 sql 脚本:
init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
并将其添加到您的 Dockerfile 中:
Dockerfile
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/
但自 2015 年 7 月 8 日起,如果您只需要创建一个用户和数据库,使用 POSTGRES_USER、POSTGRES_PASSWORD 和 POSTGRES_DB 环境会更容易变量:
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres
或使用 Dockerfile:
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
适用于 2015 年 7 月 23 日之前的图片
来自the documentation of the postgres Docker image,据说
[...] 它将获取在该目录 [/docker-entrypoint-initdb.d] 中找到的任何 *.sh 脚本,以便在启动服务之前进行进一步的初始化
这里重要的是“在启动服务之前”。这意味着您的脚本 make_db.sh 将在 postgres 服务启动之前执行,因此错误消息 “无法连接到数据库 postgres”。
之后还有一条有用的信息:
如果您需要在初始化过程中执行 SQL 命令,强烈建议使用 Postgres 单用户模式。
同意这乍一看可能有点神秘。它说的是您的初始化脚本应该在执行其操作之前以单一模式启动 postgres 服务。所以你可以改变你的 make_db.ksh 脚本如下,它应该让你更接近你想要的:
注意,最近in the following commit 发生了变化。这将适用于最新更改:
export PGUSER=postgres
psql <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
以前需要使用--single 模式:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL