在 docker 容器中安装 PostgreSQL

Posted

技术标签:

【中文标题】在 docker 容器中安装 PostgreSQL【英文标题】:Installing PostgreSQL within a docker container 【发布时间】:2014-07-06 15:27:24 【问题描述】:

我一直在关注几个不同的教程以及官方教程,但是每当我尝试在容器中安装 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"?

我在 SO 和整个互联网上查看了几个问题,但没有运气。

【问题讨论】:

【参考方案1】:

问题是您的应用程序/项目正试图访问主机机器(而不是 docker 容器)中的 postgres 套接字文件。

要解决这个问题,要么必须在使用 -p 标志为 postgres 容器设置端口时显式请求 tcp/ip 连接,要么使用 -v 与 HOST 共享 unix 套接字标志。

:注意: 使用 -v--volume= 标志意味着您在 HOST 机器和 docker 容器之间共享一些空间。这意味着如果您在主机上安装了 postgres 并且它正在运行,您可能会遇到问题。

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

docker run -p 5432:5432 -v /var/run/postgresql:/var/run/postgresql -d --name postgres postgres

还有其他解决方案,但我觉得这个最合适。最后,如果需要访问的应用程序/项目也是一个容器,最好将它们链接起来。

【讨论】:

为什么卷在这里很重要,我如何运行类似的命令但保留数据?我假设我会命名该卷? @VincentBuscarello 您将创建一个存储数据的卷,这意味着将 /var/lib/postgresql/data 从容器内部链接到外部某个地方 > 墨迹 /var/lib/postgresql/data 从容器内部到外部某处 : 是这样做的吗?这是怎么做到的? @Vasspilka 但是如果我想从 docker-compose.yml 运行我的图像该怎么办【参考方案2】:

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

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

psql -h localhost [any other params]

UPD。或者与主机共享 UNIX 套接字描述符(将在其中启动 psql),如 main answer 所示。但我更喜欢使用 TCP 套接字作为易于管理的方法。

【讨论】:

【参考方案3】:

以下是修复该错误的说明,这些说明也适用于您的 docker 容器:PostgreSQL error 'Could not connect to server: No such file or directory'

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

许多容器都是从 github 上的可信存储库构建的。因此,如果您发现一个似乎满足您的需求的,您可以查看源代码。

Flynn 项目还包括一个可能值得一试的 postgresql 设备:https://github.com/flynn/flynn-postgres

【讨论】:

感谢@toddsampson,但您链接的错误似乎不是问题,不过我决定使用您推荐的索引中的预配置图像。我意识到我没有提供太多信息,但您可能会怀疑是什么导致了这种行为? @Hevlastka 我很好奇:如果这个答案没有为您提供解决方案,您为什么接受它?我现在遇到了同样的问题,看到一个没有解决问题的公认答案有点令人沮丧。 @Mihai 我接受了这个作为答案,因为它让我走上了寻找解决方案的正确轨道。事实证明,我所经历的错误实际上是一个虚假的错误,隐藏了它背后的真正错误。看看official postgres Dockerfile。在我的情况下,postgres 服务器从未启动,因此我必须创建一个使用 ENTRYPOINT 调用的自定义脚本。 @Hevlastka 你能分享那个脚本或者至少是基本部分吗? @chachan 我目前使用的 bash 可以在 here 找到。如果我能找到它,我会链接我的旧初始化 bash 文件!【参考方案4】:
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

【讨论】:

【参考方案5】:

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

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

现在,从您的 .env 导出连接字符串或数据库凭据,并在应用程序中使用它。 参考:detailed installion and running

【讨论】:

以上是关于在 docker 容器中安装 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker 中安装地理空间库

如何在我的 docker 镜像中安装 postgresql?

如何在高山容器中安装 Docker?

docker 在容器中安装yum等软件

如何在ubunto中安装docker

在 docker 容器中安装猫鼬