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

时间:2014-12-28 03:53:39

标签: postgresql docker fig

我使用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界面?

5 个答案:

答案 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 ... 

来源:https://docs.docker.com/userguide/dockerlinks/

答案 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