Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t连接到docker compose内部的postgres_Python_Postgresql_Docker - Fatal编程技术网

Python Can';t连接到docker compose内部的postgres

Python Can';t连接到docker compose内部的postgres,python,postgresql,docker,Python,Postgresql,Docker,试图通过docker compose实现简单的设置flask+postgres+nginx,如果我删除了db连接逻辑,一切似乎都正常,但否则它无法解析服务名称,无法连接到数据库: 烧瓶错误: app_1 | {for debug, conn string used} postgresql://postgres:kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ@postgres:5432/postgres ap

试图通过docker compose实现简单的设置flask+postgres+nginx,如果我删除了db连接逻辑,一切似乎都正常,但否则它无法解析服务名称,无法连接到数据库:

烧瓶错误:

app_1       | {for debug, conn string used} postgresql://postgres:kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ@postgres:5432/postgres
app_1       | {for debug, start timestamp of first attempt to connect} 2018-03-25 18:38:48.898683
app_1       | Error: (psycopg2.OperationalError) could not translate host name "postgres" to address: Name or service not known
app_1       |  (Background on this error at: http://sqlalche.me/e/e3q8)
That last error repeats bunch of times, since I'm making multiple attempts to connect until it succeeds.
博士后日志:

postgres_1  | 2018-03-25 18:38:38.871 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1  | 2018-03-25 18:38:38.871 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1  | 2018-03-25 18:38:38.875 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1  | 2018-03-25 18:38:38.891 UTC [19] LOG:  database system was shut down at 2018-03-25 18:38:37 UTC
postgres_1  | 2018-03-25 18:38:38.896 UTC [1] LOG:  database system is ready to accept connections
需要注意的是,当我尝试建立连接时,问题并不是postgres还没有准备好(检查timestamps+im尝试在python中多次建立连接,如果失败了,每个连接之间都会有很小的延迟)

组成:

version: '2'
services:

  data:
    image: postgres:latest
    volumes:
      - /var/lib/postgresql
    command: "true"

  postgres:
    restart: always
    image: postgres:latest
    env_file:
      - db_env_file
    volumes_from:
      - data
    ports:
      - "5432:5432"
    expose:
      - "5432"

  app:
    restart: always
    build: ./app
    env_file:
      - app_env_file
    networks:
      - mainnet
    depends_on:
      - "postgres"
    links:
      - postgres:postgres
    volumes:
      - ./app:/usr/src/app

  nginx:
    restart: always
    build: ./nginx
    networks:
      - mainnet
    links:
      - app
    volumes:
      - ./app/static:/usr/share/nginx/html
    ports:
      - "80:8080"

networks:
    mainnet:
数据库环境文件

POSTGRES_USER=postgres
POSTGRES_DB=postgres
POSTGRES_PASSWORD=kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ
PGDATA=/var/lib/postgresql/data/app_db_data
应用程序环境文件

PYTHONUNBUFFERED=1 应用程序\数据库\连接\字符串=postgresql://postgres:kftxx2h9mvOqhz3zyLIL-NG7RIUABFEZDCKCNTSKA-OmeASaSFk3frbKJMVqsZ@app_db:5432/博士后

DEBUG_ENABLE=true
APP_SECRET=5:G[m+^]`^a|>^F^t8@5r/?$}S'S$(3q"{0qZN%JH!wYlwp"~"Gcw{Wd7CP]=K&P=R6klvzcg1]"!j+EY!lYJBtR:HLlXIqg#h$Uimb8ZycZg`>(1KvdNAxV16o62sF~_$Spo1+G-c-/k"Nlv(:>d5<~=X!M2iz0kc(5xZg^*MR$S.cp^^d7osHBsz<6Xsov8-X&1]LTzscCv1G}]RUsWP@v
DB_NAME=postgres
DB_USER=postgres
DB_PASS=kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-OmeASaSFk3frbKJMVqsZ
DB_SERVICE=postgres
DB_PORT=5432
尝试将连接uri改为localhost,将“expose:5432”添加到postgre,但没有真正起到帮助作用,正如日志所述

app_1       | Error: (psycopg2.OperationalError) could not translate host name "postgres" to address: Name or service not known
我猜这是因为您没有设置容器的主机名。

要验证这一点,可以检查每个容器中的
/etc/hosts
。 例如:

# get the containers name
docker ps
# display /etc/hosts content
docker exec -it <your_container_name> cat /etc/hosts
#获取容器名称
docker ps
#显示/etc/hosts内容
docker exec-it cat/etc/hosts
此外,由于您的容器加入相同的
网络
,因此不需要使用
链接
来相互连接。

能否删除链接和网络,使所有容器都位于同一网络上?
hostname: foo
# get the containers name
docker ps
# display /etc/hosts content
docker exec -it <your_container_name> cat /etc/hosts