无法使用 Postgres、Docker Compose 和 Psycopg2 将主机名“db”转换为地址

新手上路,请多包涵

在一个文件夹中,我有 3 个文件:base.py、Dockerfile 和 docker-compose.yml。

基础.py:

 import psycopg2

conn = psycopg2.connect("dbname='base123' user='postgres' host='db' password='pw1234'")

Dockerfile:

 FROM ubuntu:16.04

RUN apt-get update
RUN apt-get -y install python-pip
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install psycopg2-binary

COPY base.py base.py

RUN python base.py

码头工人-compose.yml:

 version: '3'
services:
  db:
    image: 'postgres:latest'
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: pw1234
      POSTGRES_DB: base123
  aprrka:
    build: .
    depends_on:
      - db

运行 docker-compose up 后,出现以下错误:

 Traceback (most recent call last):
  File "base.py", line 5, in <module>
conn = psycopg2.connect("dbname='base123' user='postgres' host='db' password='pw1234'")
   File "/usr/local/lib/python2.7/dist-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known

ERROR: Service 'aprrka' failed to build: The command '/bin/sh -c python base.py' returned a non-zero code: 1

我不知道为什么我有这个错误。我暴露了 5432 端口。默认情况下,Compose 为应用程序设置了一个网络。每个服务都加入默认网络,我认为我的应用程序与 postgres 应该一起工作。我写的 docker-compose.yml 不正确吗?

原文由 gongarek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 710
2 个回答

问题是您不应该运行 python base.py 作为 RUN 指令的一部分。

RUN 指令仅在您构建映像时执行。 postgres 容器此时没有运行,也没有创建网络。相反,您想使用 CMD 指令。

Dockerfile 更改为:

 FROM ubuntu:16.04

RUN apt-get update
RUN apt-get -y install python-pip
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install psycopg2-binary

COPY base.py base.py

CMD ["python", "base.py"]

以上应该导致主机名 db 得到解析。但是,如果您的 python 代码没有任何用于连接到数据库的重新连接逻辑,则容器可能仍然会出错。这是因为 postgres 容器将运行,但数据库尚未准备好接受连接。

这可以通过将 restart: always 添加到您的 docker-compose.yml 来临时解决。

 version: '3'
services:
  db:
    image: 'postgres:latest'
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: pw1234
      POSTGRES_DB: base123
  aprrka:
    restart: always
    build: .
    depends_on:
      - db

希望这将使您启动并运行。

原文由 Jack Gore 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 docker compose 文件中在 同一网络 上添加数据库和 Web 服务。启动 db 服务后,还要 链接 db 服务并启动 web 服务。

正确添加 网络后,docker compose 文件中的 link 和 depends_on 配置问题将得到修复。

配置示例:

   services:
      db:
          container_name: db
          networks:
              - djangonetwork
      web:
          depends_on:
             - db
          links:
             - db:db
          networks:
             - djangonetwork

  networks:
      djangonetwork:
          driver: bridge

在我的 docker compose 文件中,我使用网络名称作为“djangonetwork”,您可以使用任何其他名称。

上述配置帮助我解决了“无法翻译主机名数据库”的问题。

原文由 Nivratti Boyane 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题