我想要一个可与Postgresql数据库(psycopg2)一起运行的python flask应用程序。所以我做了这个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目录中。

  • 有任何想法吗 ?

    感谢您的答复,祝您有愉快的一天。

    最佳答案

    我认为发生的事情是,即使将depends_on标志设置为database,这也仅意味着web容器将在database容器启动后启动。但是,第一次,数据库通常需要花费相当长的时间才能建立,并且当web服务器启动时,数据库仍未准备好接受连接。

    解决此问题的2种方法:

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

    关于python - Docker公开容器之间的端口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60737960/

    10-10 00:37
    查看更多