【问题标题】:Docker expose ports between containersDocker 暴露容器之间的端口
【发布时间】:2020-06-29 10:53:24
【问题描述】:

我想要一个 python 烧瓶应用程序,它与 postgresql 数据库 (psycopg2) 一起运行。所以我制作了这个 docker-compose 文件:

version: "3"
services:
  web:
    depends_on:
      - database
    container_name: web
    build:
      context: "."
      dockerfile: "docker/Dockerfile.web"
    ports:
      - 5000:5000
    volumes:
      - database:/var/run/postgresql
  database:
    container_name: database
    environment:
      POSTGRES_PASSWORD: "password"
      POSTGRES_USER: "user"
      POSTGRES_DB: "products"
    image: postgres
    expose:
    - 5432
    volumes:
    - database:/var/run/postgresql
volumes:
  database:

在我的 app.py 中,我尝试像这样连接到 postgres:

conn = psycopg2.connect(database="products", user="user", password="password", host="database", port="5432")

当我运行 docker-compose up 时,我收到以下错误:
"服务器是否在主机 "数据库" (172.21.0.2) 上运行并接受端口 5432 上的 TCP/IP 连接?"

我不知道我在哪里弄错了。

  • 容器“数据库”公开其端口 5432。
  • 两个容器都在同一个网络上,即“web_app_default”。
  • 套接字文件存在于“web”容器的/var/run/postgresql 目录中。

有什么想法吗?

感谢您的回复,祝您有美好的一天。

【问题讨论】:

    标签: python postgresql docker docker-compose psycopg2


    【解决方案1】:

    我认为发生的情况是,即使您将标志 depends_on 设置为 database,这仅意味着 web 容器将在 database 容器启动后启动。但是,第一次建立数据库通常需要相当长的时间,当您的web 服务器启动时,数据库还没有准备好接受连接。

    解决此问题的两种方法:

    1. 无需更改代码的简单方法:运行docker-compose up -d(detach 模式)并等待数据库完成初始化。然后再次运行docker-compose up -d,您的web 容器现在将能够连接到数据库。
    2. 第二种方法是使用restart: always 更新web 容器,因此docker-compose 将继续尝试重新启动您的web 容器,直到它成功运行(直到数据库准备好接受连接)
    version: "3"
    services:
      web:
        depends_on:
          - database
        ...
        restart: always
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2019-09-10
      • 2018-09-03
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      相关资源
      最近更新 更多