Docker公开容器之间的端口

时间:2020-03-18 10:50:48

标签: python postgresql docker docker-compose psycopg2

我想拥有一个运行有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目录中。

有什么想法吗?

感谢您的回复,并祝您愉快。

1 个答案:

答案 0 :(得分:2)

我认为发生的事情是,即使将标志<v-checkbox v-for="option in pref.options" :key="option" :v-model="pref.selectedOption" :label="option" color="red" value="option" hide-details 设置为depends_on,也仅意味着database容器将在web容器启动之后启动。但是,这通常是第一次,数据库通常需要花费相当长的时间才能建立,并且在database服务器启动时,数据库仍未准备好接受连接。

两种解决此问题的方法:

  1. 无需更改代码的简便方法:运行webdocker-compose up -d模式),然后等待数据库完成初始化。然后再次运行detach,您的docker-compose up -d容器现在可以连接到数据库了。
  2. 第二种方法是用web更新web容器,因此restart: always将继续尝试重新启动docker-compose容器,直到容器成功运行为止(直到数据库准备就绪为止)。接受连接)
web