我一直在尝试通过创建自定义用户和数据库来为开发 postgres 实例设置一个容器。我正在使用官方的 postgres docker image。在文档中,它指示您在文件夹中插入一个 bash 脚本,/docker-entrypoint-initdb.d/以使用任何自定义参数设置数据库。
/docker-entrypoint-initdb.d/
su postgres -c "createuser -w -d -r -s docker" su postgres -c "createdb -O docker docker"
FROM library/postgres RUN ["mkdir", "/docker-entrypoint-initdb.d"] ADD make_db.sh /docker-entrypoint-initdb.d/
我从docker logs -f db(db 是我的容器名称)得到的错误是:
docker logs -f db
createuser:无法连接到数据库 postgres:无法连接到服务器:没有这样的文件或目录
似乎在/docker-entrypoint-initdb.d/启动 postgres 之前正在执行文件夹内的命令。我的问题是,如何使用官方的 postgres 容器以编程方式设置用户/数据库?有没有办法用脚本做到这一点?
官方的postgres docker 镜像将运行文件夹.sql中的脚本。/docker-entrypoint- initdb.d/
.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环境变量会更容易:
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
从postgres Docker 映像的文档中,据说
[…] 它将获取在该目录 [ /docker-entrypoint-initdb.d] 中找到的任何 *.sh 脚本,以在启动服务之前进行进一步的初始化
/docker-entrypoint-initdb.d
这里重要的是 “在启动服务之前” 。这意味着您的脚本 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模式:
--single
gosu postgres postgres --single <<- EOSQL CREATE USER docker; CREATE DATABASE docker; GRANT ALL PRIVILEGES ON DATABASE docker TO docker; EOSQL