Python Can';t连接到docker compose内部的postgres
试图通过docker compose实现简单的设置flask+postgres+nginx,如果我删除了db连接逻辑,一切似乎都正常,但否则它无法解析服务名称,无法连接到数据库: 烧瓶错误: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
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