在一个文件夹中,我有3个文件:base.py、Dockerfile和docker-compose.yml。
基.py:
import psycopg2
conn = psycopg2.connect("dbname='base123' user='postgres' host='db' password='pw1234'")
文档文件:
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
docker 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不正确吗?
问题是不应该将
python base.py
作为RUN
指令的一部分运行。只有在构建映像时才执行
RUN
指令。此时postgres
容器未运行,也未创建网络。相反,您需要使用CMD
指令。将
Dockerfile
更改为:上述操作将导致主机名
db
被解析。但是,如果您的python代码没有任何连接到数据库的重新连接逻辑,则容器可能仍然会出错。这是因为postgres
容器正在运行,但数据库尚未准备好接受连接。这可以通过将
restart: always
添加到docker-compose.yml
中来临时修复。希望这能让你振作起来。
相关问题 更多 >
编程相关推荐