【发布时间】:2019-01-15 22:57:34
【问题描述】:
在一个文件夹中,我有 3 个文件:base.py、Dockerfile 和 docker-compose.yml。
base.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
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 吗?
【问题讨论】:
-
jack-gore 的回答解决了您的问题。诊断的一种方法可能是使用已知良好的第二个容器来访问
db。请参阅 docs.docker.com 上的映像文档以及adminer映像 (docs.docker.com/samples/library/postgres/…) 的使用。其次,Dockerfile 将受益于通过减少RUN命令的数量来减少创建的层数。例如RUN apt-get update && apt-get -y install python-pip(你不需要最后的apt-get update)。
标签: python postgresql docker docker-compose psycopg2