Postgres在Docker上。 我如何创build一个数据库和用户?

我正在尝试用docker创build简单的postgres服务器。 我使用官方postgres图像作为我的容器的基础。 我的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”?

我做错了什么?

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

在入口点脚本里面有同样的问题。 以下是我的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" 

在createuser命令之前添加sleep 1 @seanmclbuild议更正为我工作:

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

使用带-w标志的pg_ctl,这样命令将在服务器启动时完成。 没有更多的想知道我们是否等了很久。 而且我们实际上可以用相同的方式停止服务器

 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 

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

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

主要部分是–volume标志。 它将包含unix套接字文件.s.PGSQL.5432的文件夹链接到主机,以便被其他进程读取。

这似乎是一个在Docker容器中安装PostgreSQL的重复问题,对吗?