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

sar*_*gas 27 postgresql docker fig

我使用fig网站上的教程创建了一个postgres容器.我命名了容器db.

容器正在运行,我的应用程序正常连接.我试图运行命令fig run db psqlDB容器中运行,并得到了错误:

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

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

sar*_*gas 53

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

我通过查找容器名称docker ps并查看NAMES列来实现它.

然后psql在运行容器中运行该命令docker exec -ti NAME_OF_CONTAINER psql -U YOUR_POSTGRES_USERNAME

请注意,在正在运行的容器上docker exec运行该psql命令,而不是docker run启动新容器.


更新

fig现在被称为docker-compose

  • 可能还需要提及数据库名称,如下所示:`docker exec -ti NAME_OF_CONTAINER psql -U YOUR_POSTGRES_USERNAME DATABASE` (3认同)
  • 好答案!区分`docker run <image>`和`docker exec <container>`非常重要。你也可以只是`docker exec -it /bin/bash` **用于开发**。 (2认同)

Tom*_*iri 11

而不是连接:

psql
Run Code Online (Sandbox Code Playgroud)

使用 -h 和 -p 选项:

psql -h localhost -p 5432
Run Code Online (Sandbox Code Playgroud)

为什么这样做?

如果我们在没有参数的情况下运行本地 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
Run Code Online (Sandbox Code Playgroud)

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


Tho*_*lan 7

我的 2P 在这里:

docker run --rm --name postgresql -p 5432:5432
-e POSTGRES_USER=admin -e POSTGRES_PASSWORD=admin
-e POSTGRES_DB=demodb
-d postgres:latest
docker exec -it postgresql psql -d demodb -U admin
Run Code Online (Sandbox Code Playgroud)