Postgres在Docker上。如何创建数据库和用户?

时间:2014-10-05 09:18:47

标签: postgresql docker

我试图用docker创建简单的postgres服务器。我使用官方postgres image作为我的容器的基础。 我的Dockerfile包含以下命令:

FROM postgres
USER postgres
RUN /etc/init.d/postgresql start &&\
    psql --command "CREATE USER user WITH SUPERUSER PASSWORD 'user';" &&\
    createdb -O user app

当我尝试运行它时出现错误:

  

psql:无法连接到服务器:没有这样的文件或目录           服务器是在本地运行还是接受           Unix域套接字上的连接" /var/run/postgresql/.s.PGSQL.5432"?

我做错了什么?

4 个答案:

答案 0 :(得分:2)

postgres可能需要一些时间才能开始接受连接。你编写它的方式,它会在start函数返回后立即调用CREATE USER。试着在那里睡一觉,看看它是否仍然存在问题。

答案 1 :(得分:1)

在入口点的脚本中有同样的问题。以下是我的Dockerfile摘录

# init execution
ENTRYPOINT ["/usr/local/sbin/initpostgres.sh"]

intipostgres.sh脚本

中包含以下命令
 su postgres -c "pg_ctl start -l /var/lib/postgresql/logpostgres"
 su postgres -c "createuser -s $OPENERPUSER"

在每个@seanmcl的createuser命令之前添加sleep 1建议更正为我工作:

 su postgres -c "pg_ctl start -l /var/lib/postgresql/logpostgres"
 sleep 1
 su postgres -c "createuser -s $OPENERPUSER"

答案 2 :(得分:1)

将pg_ctl与-w标志一起使用,以便在服务器启动时完成该命令。不再想知道我们是否已经等了足够长的时间。我们实际上可以用同样的方式停止服务器

sudo -u postgres pg_ctl start -w -D ${PGDATA}

sudo -u postgres psql --command "CREATE USER user WITH SUPERUSER PASSWORD 'user';" &&\
sudo -u postgres createdb -O user app

sudo -u postgres pg_ctl stop -w

答案 3 :(得分:1)

问题似乎是postgres unix socket不在你的主机上。您可以通过运行以下命令来解决此问题。

docker run -p 5432:5432 --volume="/run/postgresql:/run/postgresql" -d --name postgres postgres

关键部分是--volume flag。它将包含unix套接字文件.s.PGSQL.5432的文件夹链接到主机,以便其他进程读取。

这似乎是Installing PostgreSQL within a docker container的重复问题,是对的OP吗?