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

2024-05-20 23:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

基.py:

import psycopg2

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

文档文件:

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

docker 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不正确吗?


Tags: pipcomposedockerrunpyhostdbbase
1条回答
网友
1楼 · 发布于 2024-05-20 23:33:29

问题是不应该将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

希望这能让你振作起来。

相关问题 更多 >