无法连接到docker compos内部的postgres

2024-09-16 14:49:25 发布

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

尝试用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日志:

^{pr2}$

只是要注意的是,当我尝试建立连接时,问题不是postgres还没有准备好(检查timestamps+im尝试在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:

数据库环境文件

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

应用程序环境文件

Python缓冲=1 APP_DB_CONNECT_STRING=postgresql://postgres:kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-omeasfk3frbkjmvqsz@app_db:5432/博士后

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,但没有实际帮助


Tags: envappdbdatapostgresqlconnectnginxpostgres
1条回答
网友
1楼 · 发布于 2024-09-16 14:49:25

正如你的日志所说

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

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

^{pr2}$

要验证这一点,可以检查每个容器中的/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

相关问题 更多 >