我使用fig website上的教程创建了一个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
界面?
答案 0 :(得分:49)
fig 将使用与fig.yml
文件中使用的名称不同的名称创建 docker容器。
我通过使用docker ps
查找容器名称并查看 NAMES 列来了解它。
然后使用psql
docker exec -ti NAME_OF_CONTAINER psql -U YOUR_POSTGRES_USERNAME
命令
请注意docker exec
在正在运行的容器上运行psql
命令,而docker run
将启动一个新容器。
fig 现在称为docker-compose
答案 1 :(得分:2)
您需要运行一个新容器来连接图中启动的容器。这是因为默认情况下主容器启动服务,如果你执行fig run db psql
无法启动服务,而是运行psql客户端。请参阅the Dockerfile。
因此,要连接到PostgreSQL服务,您需要运行链接到图1开头的另一个容器。请参阅https://registry.hub.docker.com/_/postgres/。
首先,由于fig更改了已启动容器的名称,因此在完成docker ps
后检查fig up
容器的NAMES列。然后:
docker run -it --link <postgres_container_name>:postgres --rm postgres sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'
您也可以使用docker exec
技巧以及@sargas所描述的技巧,但链接方式对我来说听起来更为规范。
答案 2 :(得分:1)
您可以发布docker ps
的结果吗?我的猜测是你需要指定postgres容器正在暴露的端口。运行docker ps
应该会给你
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
948b1f6ebc0a my_postgres:latest "/usr/lib/postgresql 6 days ago Up 6 days 0.0.0.0:49155->5432/tcp db
并查看数据库容器的PORTS列,您将看到数据库实际暴露的端口。在这种情况下,它是49155,但如果未在容器启动时明确指定,则docker将在49153和65535之间选择一个随机端口。您需要向psql提供-p
选项,然后将该端口作为目标
psql -p 49155 ...
答案 3 :(得分:0)
与其联系:
psql
使用-h和-p选项:
psql -h localhost -p 5432
为什么这样做?
如果我们运行不带参数(或带不正确参数)的本地psql,psql将尝试通过套接字而不是tcp进行连接,因为这样做效率更高。
但是,psql的微优化不适用于我们的古怪设置,因为容器的文件系统是按设计分离的,即使不是psql也不会知道在哪里寻找套接字。
该解决方案不是写一个魁梧的docker exec命令,也不是装载一个卷,以便我们本地的psql实例可以在容器中找到套接字,而是将整个交互移到tcp。
当然这会稍微降低效率,但是我们使用容器的原因是即使它们安装在不同的计算机上也可以正常工作, TCP是docker容器用来在进程之间通信的工具,无论是在还是同一台机器。。
要告诉psql我们要通过TCP连接,我们使用-h选项以及-p端口。
psql -h localhost -p 5432
现在,如果无法找到套接字,psql不能尝试通过tcp进行连接吗?
答案 4 :(得分:-1)
我的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