在一个文件夹中,我有 3 个文件:base.py、Dockerfile 和 docker-compose.yml。
基础.py:
import psycopg2
conn = psycopg2.connect("dbname='base123' user='postgres' host='db' password='pw1234'")
Dockerfile:
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get -y install python-pip
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install psycopg2-binary
COPY base.py base.py
RUN python base.py
码头工人-compose.yml:
version: '3'
services:
db:
image: 'postgres:latest'
expose:
- "5432"
environment:
POSTGRES_PASSWORD: pw1234
POSTGRES_DB: base123
aprrka:
build: .
depends_on:
- db
运行 docker-compose up
后,出现以下错误:
Traceback (most recent call last):
File "base.py", line 5, in <module>
conn = psycopg2.connect("dbname='base123' user='postgres' host='db' password='pw1234'")
File "/usr/local/lib/python2.7/dist-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known
ERROR: Service 'aprrka' failed to build: The command '/bin/sh -c python base.py' returned a non-zero code: 1
我不知道为什么我有这个错误。我暴露了 5432 端口。默认情况下,Compose 为应用程序设置了一个网络。每个服务都加入默认网络,我认为我的应用程序与 postgres 应该一起工作。我写的 docker-compose.yml 不正确吗?
原文由 gongarek 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题是您不应该运行
python base.py
作为RUN
指令的一部分。RUN
指令仅在您构建映像时执行。postgres
容器此时没有运行,也没有创建网络。相反,您想使用CMD
指令。将
Dockerfile
更改为:以上应该导致主机名
db
得到解析。但是,如果您的 python 代码没有任何用于连接到数据库的重新连接逻辑,则容器可能仍然会出错。这是因为postgres
容器将运行,但数据库尚未准备好接受连接。这可以通过将
restart: always
添加到您的docker-compose.yml
来临时解决。希望这将使您启动并运行。