【问题标题】:Docker-compose: App can not connect to Postgres containerDocker-compose:应用程序无法连接到 Postgres 容器
【发布时间】:2019-07-30 04:03:02
【问题描述】:

使用 docker-compose up 时,我的 Phoenix 应用无法连接到 Postgres 容器。

我的 docker-compose.yml:

version: '3.5'

services:
  web:
    image: "solaris_cards:latest"
    ports:
      - "80:4000"
    env_file:
      - config/docker.env
    depends_on:
      - db

  db:
    image: postgres:10-alpine
    volumes:
      - "/var/lib/postgresql/data/pgdata/var/lib/postgresql/data"
    ports:
      - "5432:5432"
    env_file:
      - config/docker.env

在 web 容器中运行的应用程序抱怨与 Postgres 容器的连接不存在:

[error] Postgrex.Protocol (#PID<0.2134.0>) failed to connect: ** (DBConnection.ConnectionError) tcp connect (db:5432): non-existing domain - :nxdomain

我的环境变量:

DATABASE_HOST=db
DATABASE_USER=postgres
DATABASE_PASS=postgres

我尝试过先单独运行 Postgres 容器,然后再运行 Web 容器,但还是有同样的问题。

如果我将数据库主机更改为 0.0.0.0(这是 Postgres 运行时显示的内容),那么它似乎可以连接,但连接被拒绝而不是找不到。

但是 docker 应该能够在我手动输入 ip 的情况下翻译主机名。

【问题讨论】:

  • 从您的网络容器(docker exec -it web sh)尝试命令getent hosts db,它应该显示您的数据库容器的IP。如果没有,则名称解析有问题,如果有,则可能是 db 容器有问题
  • @PierreB。我在我的 Web 容器上尝试了 getent hosts db 命令,但它什么也没返回。
  • 奇怪,我尝试了您的 compose 的类似版本,它可以工作:getent hosts db 172.23.0.2 db db您是否尝试过然后升级您的 compose?
  • @PierreB。进一步挖掘后,我发现了问题。由于卷已包含数据,Postgres 容器正在退出。能够使用 docker-compose down -v 清除卷并解决了问题。感谢您的帮助。

标签: postgresql docker docker-compose phoenix-framework


【解决方案1】:

Postgres 正在退出,因为它的卷已经包含数据。

通过清理目录解决了这个问题:

docker-compose down -v

【讨论】:

    最近更新 更多