我的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日志中获取的错误-f db(db是我的容器名称)是:
createuser:无法连接到数据库postgres:无法连接到服务器:没有这样的文件或目录
似乎在/docker-entrypoint-initdb.d/文件夹中的命令在postgres启动之前正在执行。我的问题是,如何使用官方postgres容器以编程方式设置用户/数据库?有任何方法来做这个用脚本吗?
official postgres docker image将运行/docker-entrypoint-initdb.d/文件夹中的.sql脚本。
所以你需要的是创建以下sql脚本:
init.sql
CREATE USER docker; CREATE DATABASE docker; GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
并将其添加到Dockerfile中:
Dockerfile
FROM library/postgres ADD 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日之前的图片
从the documentation of the postgres Docker image,据说
[…] it will source any *.sh script found in that directory [
/docker-entrypoint-initdb.d
] to do further initialization before starting the service
这里重要的是“启动服务之前”。这意味着您的脚本make_db.sh将在postgres服务启动之前执行,因此错误消息“无法连接到数据库postgres”。
之后,还有一个有用的信息:
If you need to execute sql commands as part of your initialization,the use of Postgres single user mode is highly recommended.
同意这可能有点神秘在第一眼看。它说的是,您的初始化脚本应该在执行其操作之前以单一模式启动postgres服务。所以你可以改变你的make_db.ksh脚本如下,它应该让你更接近你想要的:
注意,这已更改最近in the following commit.这将与最新的更改:
export PGUSER=postgres psql <<- EOsql CREATE USER docker; CREATE DATABASE docker; GRANT ALL PRIVILEGES ON DATABASE docker TO docker; EOsql
以前,需要使用 – 单独模式:
gosu postgres postgres --single <<- EOsql CREATE USER docker; CREATE DATABASE docker; GRANT ALL PRIVILEGES ON DATABASE docker TO docker; EOsql