如何进入正在运行的 postgres 容器的 psql?

新手上路,请多包涵

我使用 无花果网站 上的教程创建了一个 postgres 容器。我将容器命名为 db

容器正在运行,我的应用程序可以正常连接到它。我尝试在 db 容器运行的情况下运行命令 fig run db psql 并得到错误:

 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"?

如何进入正在运行的 db 容器中的 psql 接口?

原文由 sargas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 650
2 个回答

fig 将创建一个名称与 fig.yml 文件中使用的名称不同的 docker _容器_。

我通过使用 docker ps 找到容器名称并查看 NAMES 列来使其工作。

然后使用 --- 在正在运行的容器中运行 docker exec -ti NAME_OF_CONTAINER psql -U YOUR_POSTGRES_USERNAME psql 命令

重要的提示:

  • docker exec 在正在运行的容器上运行 psql 命令
  • docker run 将启动一个新容器。

更新

fig 现在被称为 docker-compose

原文由 sargas 发布,翻译遵循 CC BY-SA 4.0 许可协议

而不是连接:

 psql

使用 -h 和 -p 选项:

 psql -h localhost -p 5432

为什么这行得通?

如果我们在没有参数(或使用不正确的参数)的情况下运行本地 psql,psql 将尝试通过 unix 套接字而不是 tcp 进行连接,因为这样更有效。

但是,psql 的微优化不适用于我们古怪的设置,因为我们容器的文件系统在设计上是分开的。即使不是,psql 也不知道在哪里寻找套接字文件。

解决的办法不是写个粗壮的docker exec命令,也不是挂载一个volume,让我们本地的psql实例能找到容器中的socket, 而是把整个交互移到tcp上。

当然,这效率略低,但我们使用容器的真正原因是即使它们设置在不同的计算机上也能正常工作, TCP 是 docker 容器用于在进程之间进行通信的工具,无论是否在同一台机器上。 .

为了告诉 psql 我们想通过 TCP 连接,我们使用 -h 选项来识别(虚拟)机器,以及 -p 来识别 postgresql 进程,5432 是默认值。

 psql -h localhost -p 5432

psql 可以在没有参数的情况下在放弃之前尝试使用这些默认参数,但它选择提前失败,发出错误消息并让管理员自己制定连接细节。有关此决定的更多信息,请参见 https://www.postgresql.org/message-id/20191217141456.GA2413%40elch.exwg.net

原文由 TZubiri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题