尝试用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日志:
^{pr2}$只是要注意的是,当我尝试建立连接时,问题不是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
应用程序环境文件
Python缓冲=1 APP_DB_CONNECT_STRING=postgresql://postgres:kftxx2h9mvOqhz3zyLIL-NG7RiUabFEzdCQCNtska-omeasfk3frbkjmvqsz@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
连接逻辑:
print("Connecting...", file=sys.stderr)
print(self.db_connect_string)
print(datetime.datetime.now())
connected = False
connectCount = 0
while not connected:
if connectCount > 0:
sleep(1.0)
connectCount += 1
try:
conn = self.engine.connect()
conn.close()
connected = True
except OperationalError as e:
if connectCount > 100:
raise
print("Error: " + str(e), file=sys.stderr)
尝试改为将连接uri改为localhost,并将“expose:5432”添加到postgre,但没有实际帮助
正如你的日志所说
我想这是因为您没有设置容器的
^{pr2}$hostname
。 reference here要验证这一点,可以检查每个容器中的
/etc/hosts
。 例如:此外,由于您的容器加入了相同的
networks
,所以不需要使用links
来连接彼此。 Legacy container links相关问题 更多 >
编程相关推荐