我一直在尝试通过创建自定义用户和数据库来为开发postgres实例设置容器 . 我正在使用official postgres docker image . 在文档中,它指示您在 /docker-entrypoint-initdb.d/
文件夹中插入bash脚本,以使用任何自定义参数设置数据库 .
我的bash脚本:make_db.sh
su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"
Dockerfile
FROM library/postgres
RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/
我从 docker logs -f db
(db是我的容器名称)得到的错误是:
createuser:无法连接到数据库postgres:无法连接到服务器:没有这样的文件或目录
似乎在postgres启动之前正在执行 /docker-entrypoint-initdb.d/
文件夹中的命令 . 我的问题是,如何使用官方postgres容器以编程方式设置用户/数据库?有没有办法用脚本执行此操作?
4 回答
编辑 - 自2015年7月23日起
official postgres docker image将运行
/docker-entrypoint-initdb.d/
文件夹中的.sql
脚本 .所以你需要的是创建以下sql脚本:
init.sql
并将其添加到Dockerfile中:
Dockerfile
但是自2015年7月8日 if all you need is to create a user and database 以来,更容易使用
POSTGRES_USER
,POSTGRES_PASSWORD
和POSTGRES_DB
环境变量:或者使用Dockerfile:
适用于2015年7月23日之前的图片
从the documentation of the postgres Docker image,据说
这里最重要的是"before starting the service" . 这意味着您的脚本make_db.sh将在postgres服务启动之前执行,因此错误消息"could not connect to database postgres" .
之后还有另一个有用的信息:
同意这在初看时可能有点神秘 . 它说的是你的初始化脚本应该在执行其操作之前以单一模式启动postgres服务 . 因此,您可以按如下方式更改make_db.ksh脚本,它可以让您更接近您想要的内容:
NOTE ,最近发生了变化in the following commit . 这将适用于最新的变化:
以前,需要使用
--single
模式:您现在可以将.sql文件放在init目录中:
From the docs
因此,复制.sql文件将起作用 .
我在启动服务之后将自定义命令添加到CMD中引发的环境中...我没有使用postgres,而是使用Oracle:
并开始
.
在创建用户之前,您需要运行数据库 . 为此,您需要多个流程 . 您可以在shell脚本的子shell(&)中启动postgres,也可以使用supervisord之类的工具来运行postgres,然后运行任何初始化脚本 .
supervisord和docker指南https://docs.docker.com/articles/using_supervisord/