编辑 - 自 2015 年 7 月 23 日起
The 官方 postgres docker 镜像 https://hub.docker.com/_/postgres/会跑.sql
中找到的脚本/docker-entrypoint-initdb.d/
文件夹。
因此,您所需要做的就是创建以下 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
and 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 日之前的图像
From postgres Docker 镜像的文档 https://registry.hub.docker.com/_/postgres/,据说
[...]它将获取该目录中找到的任何 *.sh 脚本[/docker-entrypoint-initdb.d
] 在启动服务之前进行进一步的初始化
这里重要的是“开始服务之前”。这意味着你的脚本make_db.sh将在启动 postgres 服务之前执行,因此会出现错误消息“无法连接到数据库 postgres”.
之后还有另一个有用的信息:
如果您需要在初始化过程中执行 SQL 命令,强烈建议使用 Postgres 单用户模式。
同意,乍一看可能有点神秘。它的意思是,你的初始化脚本应该在执行操作之前以单一模式启动 postgres 服务。所以你可以改变你的make_db.ksh脚本如下,它应该让你更接近你想要的:
NOTE,这最近发生了变化在下面的提交中 https://github.com/docker-library/postgres/pull/75/commits。这将适用于最新的更改:
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