编辑 - 自 2015 年 7 月 23 日起
官方的postgres docker 镜像将运行文件夹.sql
中的脚本。/docker-entrypoint-initdb.d/
因此,您只需要创建以下 sql 脚本:
初始化.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 日之前的图片
从postgres Docker 映像的文档中,据说
[...] 它将获取在该目录 [ /docker-entrypoint-initdb.d
] 中找到的任何 *.sh 脚本,以在启动服务之前进行进一步的初始化
这里重要的是“在启动服务之前”。这意味着您的脚本make_db.sh将在 postgres 服务启动之前执行,因此错误消息"could not connect to database 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
模式:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL