【问题标题】:Can't connect to postgres inside docker compose无法连接到 docker compose 中的 postgres
【发布时间】:2023-07-16 12:43:01
【问题描述】:

尝试使用 docker compose 实现简单的设置 flask + postgres + nginx,如果我删除 db 连接逻辑,一切似乎都可以正常工作,否则由于无法解析服务名称而无法连接到数据库:

烧瓶出错:

app_1       | {for debug, conn string used} postgresql://postgres:kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ@postgres:5432/postgres
app_1       | {for debug, start timestamp of first attempt to connect} 2018-03-25 18:38:48.898683
app_1       | Error: (psycopg2.OperationalError) could not translate host name "postgres" to address: Name or service not known
app_1       |  (Background on this error at: http://sqlalche.me/e/e3q8)
That last error repeats bunch of times, since I'm making multiple attempts to connect until it succeeds.

Postgres 日志:

postgres_1  | 2018-03-25 18:38:38.871 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1  | 2018-03-25 18:38:38.871 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1  | 2018-03-25 18:38:38.875 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1  | 2018-03-25 18:38:38.891 UTC [19] LOG:  database system was shut down at 2018-03-25 18:38:37 UTC
postgres_1  | 2018-03-25 18:38:38.896 UTC [1] LOG:  database system is ready to accept connections

请注意,当我尝试建立连接时,问题不是 postgres 尚未准备好(检查时间戳 + 我尝试在 python 中多次建立连接,如果它失败且每次之间的延迟很小)

撰写:

version: '2'
services:

  data:
    image: postgres:latest
    volumes:
      - /var/lib/postgresql
    command: "true"

  postgres:
    restart: always
    image: postgres:latest
    env_file:
      - db_env_file
    volumes_from:
      - data
    ports:
      - "5432:5432"
    expose:
      - "5432"

  app:
    restart: always
    build: ./app
    env_file:
      - app_env_file
    networks:
      - mainnet
    depends_on:
      - "postgres"
    links:
      - postgres:postgres
    volumes:
      - ./app:/usr/src/app

  nginx:
    restart: always
    build: ./nginx
    networks:
      - mainnet
    links:
      - app
    volumes:
      - ./app/static:/usr/share/nginx/html
    ports:
      - "80:8080"

networks:
    mainnet:

db_env_file

POSTGRES_USER=postgres
POSTGRES_DB=postgres
POSTGRES_PASSWORD=kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ
PGDATA=/var/lib/postgresql/data/app_db_data

app_env_file

PYTHONUNBUFFERED=1 APP_DB_CONNECT_STRING=postgresql://postgres:kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ@app_db:5432/postgres

DEBUG_ENABLE=true
APP_SECRET=5:G[m+^]`^a|>^F^t8@5r/?$}S'S$(3q"{0qZN%JH!wYlwp"~"Gcw{Wd7CP]=K&P=R6klvzcg1]"!j+EY!lYJBtR:HLlXIqg#h$Uimb8ZycZg`>(1KvdNAxV16o62sF~_$Spo1+G-c-/k"Nlv(:>d5<~=X!M2iz0kc(5xZg^*MR$S.cp^^d7osHBsz<6Xsov8-X&1]LTzscCv1G}]RUsWP@v
DB_NAME=postgres
DB_USER=postgres
DB_PASS=kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ
DB_SERVICE=postgres
DB_PORT=5432

连接逻辑:

 print("Connecting...", file=sys.stderr)
    print(self.db_connect_string)
    print(datetime.datetime.now())
    connected = False
    connectCount = 0
    while not connected:
        if connectCount > 0:
            sleep(1.0)

        connectCount += 1
        try:
            conn = self.engine.connect()
            conn.close()
            connected = True
        except OperationalError as e:
            if connectCount > 100:
                raise

            print("Error: " + str(e), file=sys.stderr)

尝试将连接 uri 更改为 localhost,将 'expose: 5432' 添加到 postgre 但并没有真正帮助

【问题讨论】:

  • 可以去掉链接和网络,让所有容器都在同一个网络上吗?

标签: python postgresql docker


【解决方案1】:

正如你的日志所说

app_1       | Error: (psycopg2.OperationalError) could not translate host name "postgres" to address: Name or service not known

我猜这是因为您没有设置容器的hostnamereference here

hostname: foo

要验证这一点,您可以检查每个容器中的/etc/hosts。 例如:

# get the containers name
docker ps
# display /etc/hosts content
docker exec -it <your_container_name> cat /etc/hosts

此外,由于您的容器加入同一个networks,因此您无需使用links 来相互连接。 Legacy container links

【讨论】:

    最近更新 更多