python - Docker Compose 和 Postgres 连接被拒绝

标签 python postgresql docker docker-compose ffmpeg

我知道这个问题已经被问过一百万次了,而且我已经阅读了尽可能多的答案。他们似乎都得出了一个结论(db hostname 是容器服务名称)。
我让它在我的实际代码库中工作,但是当我添加 ffmpeg 时它开始失败安装到 Dockerfile。无需执行任何其他操作,只需通过 apt-get install -y ffmpeg 安装 FFPMEG会导致我的 python 代码收到连接被拒绝的消息。如果我删除了 ffmpeg 安装行,那么我的代码会很好地连接到数据库。虽然重新运行容器会触发可怕的连接被拒绝错误。
所以我创建了一个快速示例应用程序,这样我就可以在这里发布并尝试了解正在发生的事情。但是现在无论我做什么,这个示例代码都不会连接到数据库。
所以这里 - 提前感谢您的帮助: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 的表/数据进行填充。 (此处不包括)
应用程序容器启动并执行代码,但立即失败并显示 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我收到连接被拒绝错误。
如果有人有任何想法或想法,我将不胜感激。我已经为此挣扎了三天。

最佳答案

看来我已经解决了。我确定我以前尝试过,但不管添加 networks docker-compose.yml 的部分似乎解决了这个问题。
我还必须做第二个 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

关于python - Docker Compose 和 Postgres 连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71165628/

相关文章:

python - "Fatal Python error: Couldn' t 使用 CherryPy 创建 autoTLSkey 映射

python - PySerial 未使用 python 3.6.4 导入。也是 3.5 或更高版本。

c# - 任务中的阻塞方法

oracle - container-registry.oracle.com/database/enterprise 的 pull 访问被拒绝

docker - Kubernetes 和 flannel 网络设置

python - 在 Python 正则表达式中指定匹配新行的不同方法

python - OpenCV - 将蒙版应用于彩色图像

sql - if 条件中的 Postgres 语法错误

python - 如何在与 SQLAlchemy 和 psycopg2 的 PostgreSQL 连接上设置 `lock_timeout`?

docker - 无法在 Windows 10 中使用 Docker 启用 Hyper-V 服务