编辑-自2015年7月23日起
在正式的Postgres泊坞窗图像将运行.sql
脚本中找到的/docker-entrypoint-initdb.d/
文件夹中。
因此,您所需要做的就是创建以下sql脚本:
初始化程序
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
并将其添加到您的Dockerfile中:
Docker文件
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日之前的图像
从postgres Docker映像的文档中可以说,
[...]它将启动在该目录[ /docker-entrypoint-initdb.d
]中找到的任何* .sh脚本,以在启动服务之前进行进一步的初始化
这里重要的是“启动服务之前”。这意味着您的脚本make_db.sh将在启动postgres服务之前执行,因此错误消息“无法连接到数据库postgres”。
之后,还有另一条有用的信息:
如果您需要在初始化过程中执行SQL命令,则强烈建议使用Postgres单用户模式。
同意这乍看起来可能有些神秘。它表示您的初始化脚本在执行操作之前应以单一模式启动postgres服务。因此,您可以按以下方式更改make_db.ksh脚本,它应该使您更接近所需的内容:
注意,最近在以下提交中已对此进行了更改。这将适用于最新更改:
export PGUSER=postgres
psql <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
以前,需要使用--single
mode:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
gosu postgres postgres --single < /tmp/somefile.sql