在Docker容器中安装PostgreSQL

40

尽管我已经按照几个不同的教程和官方文档操作,但是每当我尝试在容器内安装PostgreSQL时,之后都会收到以下信息:

psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我在 Stack Overflow 和互联网上查看了多个问题,但没有找到答案。

5个回答

31
问题在于你的应用程序/项目试图访问主机机器(而不是Docker容器内部)中的postgresql套接字文件。

为了解决此问题,您需要使用-p标志显式请求tcp/ip连接以设置postgres容器的端口,或使用-v标志与主机机器共享unix套接字。
:注意: 使用-v--volume=标志意味着您正在在主机机器和Docker容器之间共享一些空间。这意味着,如果您在主机上安装并运行postgresql,则可能会遇到问题。

下面我演示了如何运行一个可从tcp/ip和unix socket访问的postgres容器。同时,我将容器命名为postgres

docker run -p 5432:5432 -v /var/run/postgresql:/var/run/postgresql -d --name postgres postgres 还有其他解决方案,但我认为这个最合适。最后,如果需要访问的应用程序/项目也是容器,请直接链接它们。

1
为什么这里的音量很重要,我如何运行类似的命令但保留数据?我假设我会命名卷吗? - Vincent Buscarello
1
@VincentBuscarello,你需要创建一个存储数据的卷,这意味着将容器内 /var/lib/postgresql/data 的位置链接到外部某个位置。 - Vasspilka
将容器内的 /var/lib/postgresql/data 映射到容器外的某个位置,这是您所需要的吗?这可以通过使用 : 实现,具体操作如何呢? - Vincent Buscarello
5
@Vasspilka,如果我想从docker-compose.yml运行我的镜像,应该怎么做? - Humayun Naseer
这在Mac上行不通,因为无法在docker容器(Linux)与MacOS主机之间共享Unix套接字:https://github.com/docker/for-mac/issues/483 - Marnix.hoh
对我来说没用(POP!_OS 22.04 + docker 24.0.6) - undefined

20

默认情况下,psql 尝试使用 UNIX socket 连接到服务器。这就是为什么我们会看到 /var/run/postgresql/.s.PGSQL.5432 - 一个 UNIX socket 描述符的位置。

如果您在 docker 中运行 postgresql-server 并进行端口绑定,则需要告诉 psql 使用 TCP socket。只需添加 host 参数 (--host-h):

psql -h localhost [any other params]

更新:或者像主要答案中所示,共享 UNIX socket 描述符与在其中启动 psql 的主机。但我更喜欢使用 TCP socket 作为易于管理的方法。


1
这应该是接受的答案,我得到了这个错误。 - Hiep Tran
对我来说没起作用。在使用我的主机用户密码登录后,我收到了错误信息:psql: error: connection to server at "localhost" (::1), port 5432 failed: FATAL: password authentication failed for user "saulo" - undefined
1
@Saulo 请尝试在docker环境参数中设置POSTGRES_[USER|PASSWORD],这样你的用户名就可以被授权连接。这里有文档 https://github.com/docker-library/docs/blob/master/postgres/README.md#postgres_password - undefined
1
嗨@TimurMilovanov。你是对的。原来"saulo"用户是我作为POSTGRES_USER使用的主机用户。一旦我在postgres中创建了相同的用户(这是我的本地开发环境),它就可以工作了。非常感谢。 - undefined

0
FROM postgres:9.6

RUN apt-get update && apt-get install -q -y postgresql-9.6 postgresql-client-9.6 postgresql-contrib-9.6 postgresql-client-common postgresql-common
RUN echo postgres:postgres | chpasswd

RUN pg_createcluster 9.6 main --start

RUN /etc/init.d/postgresql start

RUN su -c "psql -c \"ALTER USER postgres PASSWORD 'postgres';\"" postgres

-1

以下是修复该错误的说明,这些说明也适用于您的Docker容器:PostgreSQL错误“无法连接到服务器:没有这样的文件或目录”

如果由于任何原因这不起作用,您可以查看Docker Index上的许多现成的postgresql docker容器以供参考:https://index.docker.io/search?q=postgresql

许多容器都是从github上的受信任的存储库构建的。因此,如果您找到一个看起来符合您需求的容器,您可以查看源代码。

Flynn项目还包括一个postgresql应用程序,值得一试:https://github.com/flynn/flynn-postgres


1
谢谢@toddsampson,但似乎你提供的错误链接并不是问题所在,尽管如此,我已决定使用你推荐的索引中的预配置镜像。我意识到我没有提供太多信息,但你能否猜测可能导致这种行为的原因? - Hevlastka
1
@Hevlastka 我很好奇:如果这个答案没有为您提供解决方案,为什么您会接受它呢?我现在也遇到了同样的问题,看到一个被接受但并不能解决问题的答案有点令人沮丧。 - Mihai
1
@Mihai 我接受了这个答案,因为它让我找到了解决方案的正确轨迹。结果发现,我遇到的错误实际上是一个虚假的错误,掩盖了真正的错误。看一下官方postgres Dockerfile。在我的情况下,postgres服务器从未启动,因此我不得不创建一个自定义脚本,使用ENTRYPOINT调用它。 - Hevlastka
@Hevlastka,你能分享一下那个脚本或者至少是基础部分吗? - chachan
@chachan,我目前使用的Bash可以在此处找到:(https://github.com/docker-library/postgres/blob/master/9.4/docker-entrypoint.sh)。如果我能找到的话,我会链接我的旧init bash文件! - Hevlastka

-1

运行以下命令创建一个新容器,其中包含正在运行的PSQL,可以从其他容器/应用程序访问。

docker run --name postgresql-container -p 5432:5432 -e POSTGRES_PASSWORD=somePassword -d postgres

现在,从您的.env文件中导出连接字符串或数据库凭据,并在应用程序中使用它。 参考:详细安装和运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接