Docker Compose 和 Postgres 连接被拒绝

Docker Compose & Postgres Connection Refused

我知道这个问题已被问过一百万次,而且我已经阅读了尽可能多的答案。他们似乎都得出了一个结论(db hostname 是容器服务名称)。

我让它在我的实际代码库中工作,但是当我将 ffmpeg 安装添加到 Dockerfile 时它开始失败。无需执行任何其他操作,只需通过 apt-get install -y ffmpeg 安装 FFPMEG 就会导致我的 python 代码收到连接被拒绝的消息。如果我删除了 ffmpeg 安装行,那么我的代码就可以很好地连接到数据库。尽管重新 运行 容器会触发可怕的连接被拒绝错误。

所以我创建了一个快速示例应用程序,这样我就可以 post 在这里尝试了解正在发生的事情。但是现在无论我做什么,这个示例代码都不会连接到数据库。

所以这里开始 - 在此先感谢您的帮助:

myapp.py

# import ffmpeg
import psycopg2

if __name__ == "__main__":
    print("Starting app...")
    # probe = ffmpeg.probe("131698249.mp4")
    # print(probe)

    try:
        connection = psycopg2.connect(
            user="docker", password="docker", host="db", port="5432", database="docker")
        cursor = connection.cursor()
        postgreSQL_select_Query = "select * from test_table"

        cursor.execute(postgreSQL_select_Query)
        print("Selecting rows from table using cursor.fetchall")
        records = cursor.fetchall()

        print("Print each row and it's columns values")
        for row in records:
            print(row)

        cursor.close()
        connection.close()
    except (Exception, psycopg2.Error) as error:
        print("Error while fetching data from PostgreSQL", error)

Dockerfile


WORKDIR /usr/src/app

COPY requirements.txt .
RUN python -m pip install -r requirements.txt

COPY . .

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

docker-compose.yml

version: '3.8'
services:
  db:
    container_name: pg_container
    image: postgres:14.1
    restart: always
    environment:
      POSTGRES_USER: docker
      POSTGRES_PASSWORD: docker
      POSTGRES_DB: docker
    ports:
      - "8000:5432"
    expose:
      - "5432"
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      - pg_data:/var/lib/postgresql/data

  myapp:
    container_name: myapp
    build:
      context: .
      dockerfile: ./Dockerfile
    restart: "no"
    depends_on:
      - db

volumes:
  pg_data:

如果我构建 运行 代码:docker compose up --detach 一切都已构建并开始。数据库启动并填充 init.sql 中的 table/data(此处未包含) 应用程序容器启动并执行代码,但立即失败并显示 Connection refused 错误。

但是,如果我从我的电脑 运行: psql -U docker -h localhost -p 8000 -d docker 它连接没有任何错误,我可以按预期查询数据库。

但是容器中的应用程序无法连接,如果我 运行 容器 docker run -it myapp /bin/bash 然后从容器内部 运行: psql -U docker -h db -p 5432 -d docker 我得到连接被拒绝错误。

如果有人有任何想法或想法,我将不胜感激。我已经为此纠结了三天了。

看来我已经解决了。我确定我以前试过这个,但无论在 docker-compose.yml 中添加 networks 部分似乎都解决了这个问题。

我还必须按照 David Maze 的评论建议执行第二个 docker-compose up -d。但是两者的结合似乎解决了我的问题。

这里是我更新的 docker-compose.yml 为了完全清楚:

version: '3.8'

services:
  postgres-db:
    container_name: pg_container
    image: postgres:14.1
    restart: always
    environment:
      POSTGRES_USER: docker
      POSTGRES_PASSWORD: docker
      POSTGRES_DB: docker
    ports:
      - "5500:5432"
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - dock-db-test

  myapp:
    container_name: myapp
    build:
      context: .
      dockerfile: ./Dockerfile
    restart: "no"
    depends_on:
      - db
    networks:
      - dock-db-test

networks:
  dock-db-test:
    external: false
    name: dock-db-test