52

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

容器正在运行,我的应用程序可以正常连接到它。我尝试在运行dbfig 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中的界面?

4

6 回答 6

102

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

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

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

重要的提示:

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

更新

fig现在被称为docker-compose

于 2014-12-28T05:49:19.353 回答
16

而不是连接:

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

于 2019-12-12T00:47:33.753 回答
12

我的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
于 2019-12-11T08:32:21.683 回答
3

您需要运行一个新容器以连接到由 fig 启动的容器。这是因为默认情况下主容器会启动服务,如果你这样做,fig run db psqlfig 将不会启动服务,而是运行 psql 客户端。请参阅Dockerfile

因此,要连接到 PostgreSQL 服务,您需要运行另一个容器,该容器链接到由 fig 启动的容器。请参阅https://registry.hub.docker.com/_/postgres/

docker ps首先,由于 fig 更改了启动容器的名称,所以在 done 之后检查容器的 NAMES 列fig up。然后:

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 所描述的那样完成技巧,但链接方式对我来说听起来更规范。

于 2014-12-28T15:55:23.340 回答
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 之间选择一个随机端口。您需要向-ppsql 提供选项,然后以该端口为目标

psql -p 49155 ... 

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

于 2014-12-28T17:59:48.470 回答
0

如果你在 kubernetes 上尝试这个,这对我有用。

kubectl run shell  -i --rm --tty --restart=Never \
    --image=postgres:9.6-alpine \
    --env="POSTGRES_USER=admin" \
    --env="POSTGRES_PASSWORD=admin" \
    --env="POSTGRES_DB=demodb" \
    --bash
于 2022-02-03T20:26:46.840 回答