无法转换主机名“ db”。使用Postgres,Docker Compose和Psycopg2解决 [英] Could not translate host name "db" to address using Postgres, Docker Compose and Psycopg2
问题描述
在一个文件夹中,我有3个文件:base.py,Dockerfile和docker-compose.yml。
In one folder I have 3 files: base.py, Dockerfile and 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
,出现以下错误:
After I ran docker-compose up
, I got the following error:
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吗?
I don't know why I have this error. I exposed port 5432. By default Compose sets up a single network for app. Each service joins the default network, I think that my app with postgres should work together. Did I write incorrect docker-compose.yml?
推荐答案
问题是您不应该运行 python base.py
作为 RUN
指令的一部分。
The problem is you should not be running python base.py
as part of the RUN
directive.
RUN
指令仅在构建映像时执行。 postgres
容器目前未运行,也未创建网络。相反,您想使用 CMD
指令。
The RUN
directive is executed only when you are building the image. The postgres
container is not running at this point, nor has the network been created. Instead you want to use the CMD
directive.
更改 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
CMD ["python", "base.py"]
上述内容应导致主机名 db
被解析。但是,如果您的python代码没有用于连接数据库的任何重新连接逻辑,则该容器很可能仍会出错。这是因为 postgres
容器将运行,但是数据库将无法接受连接。
The above should result in the hostname db
to be resolved. However if your python code doesn't have any reconnection logic for connecting to the database the container will likely still error out. This because the postgres
container will be running but the database won't be ready to accept connections.
可以通过在 docker-compose.yml
中添加 restart:always
来临时修复。
This can be temporarily fixed by adding restart: always
to your docker-compose.yml
.
version: '3'
services:
db:
image: 'postgres:latest'
expose:
- "5432"
environment:
POSTGRES_PASSWORD: pw1234
POSTGRES_DB: base123
aprrka:
restart: always
build: .
depends_on:
- db
希望这能使您启动并运行。
Hopefully this will get you up and running.
这篇关于无法转换主机名“ db”。使用Postgres,Docker Compose和Psycopg2解决的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!