我试图用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"?
我做错了什么?
答案 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吗?