Python 无法翻译主机名“;db";要解决使用Postgres、Docker Compose和Psycopg2的问题
在一个文件夹中,我有3个文件:base.py、Dockerfile和docker-compose.yml base.py:Python 无法翻译主机名“;db";要解决使用Postgres、Docker Compose和Psycopg2的问题,python,postgresql,docker,docker-compose,psycopg2,Python,Postgresql,Docker,Docker Compose,Psycopg2,在一个文件夹中,我有3个文件:base.py、Dockerfile和docker-compose.yml base.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-ge
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
version: '3'
services:
db:
image: 'postgres:latest'
expose:
- "5432"
environment:
POSTGRES_PASSWORD: pw1234
POSTGRES_DB: base123
aprrka:
build: .
depends_on:
- db
Dockerfile:
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
version: '3'
services:
db:
image: 'postgres:latest'
expose:
- "5432"
environment:
POSTGRES_PASSWORD: pw1234
POSTGRES_DB: base123
aprrka:
build: .
depends_on:
- db
docker compose.yml:
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
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
回溯(最近一次呼叫最后一次):
文件“base.py”,第5行,在
conn=psycopg2.connect(“dbname='base123'user='postgres'host='db'password='pw1234'))
文件“/usr/local/lib/python2.7/dist-packages/psycopg2/_-init__;.py”,第130行,在connect中
连接=连接(dsn,连接工厂=连接工厂,**kwasync)
psycopg2.OperationalError:无法将主机名“db”转换为地址:名称或服务未知
错误:服务“aprrka”生成失败:命令“/bin/sh-cpythonbase.py”返回非零代码:1
我不知道我为什么会有这个错误。我暴露了端口5432。默认情况下,Compose为应用程序设置单个网络。每个服务都加入默认网络,我认为我的应用程序和postgres应该一起工作。我是否编写了不正确的docker compose.yml?问题是,您不应该在
RUN
指令中运行python base.py
只有在构建映像时才会执行RUN
指令。postgres
容器此时未运行,也未创建网络。相反,您希望使用CMD
指令
将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
容器将运行,但数据库尚未准备好接受连接
通过将restart:always
添加到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
希望这能帮助您启动并运行。如果您将其添加到docker-compose.yml中的db容器中,应该可以解决此问题
environment:
- "POSTGRES_HOST_AUTH_METHOD=trust"
在docker compose文件中的相同网络上添加数据库和web服务。另外,链接数据库服务,并在启动数据库服务后启动web服务 正确添加网络后,链接和依赖于docker compose文件问题中的配置将被修复 配置示例:
services:
db:
container_name: db
networks:
- djangonetwork
web:
depends_on:
- db
links:
- db:db
networks:
- djangonetwork
networks:
djangonetwork:
driver: bridge
在我的docker compose文件中,我使用的网络名称为“djangonetwork”,您可以使用任何其他名称
上述配置帮助我解决了“无法翻译主机名数据库”的问题。另一种可能的情况 检查端口是否已被其他docker容器使用。 使用命令:
$ docker container ls --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" -a
然后在docker compose文件中更改端口/公开如果使用docker compose,请首先将此行添加到.yml:
environment:
- "POSTGRES_HOST_AUTH_METHOD=trust"
之后,仅启动db docker:
docker-compose up db
它通常应以如下消息开始:
Recreating db... done
Attaching to db
db_1 | ********************************************************************************
db_1 | WARNING: POSTGRES_HOST_AUTH_METHOD has been set to "trust". This will allow
db_1 | anyone with access to the Postgres port to access your database without
db_1 | a password, even if POSTGRES_PASSWORD is set. See PostgreSQL
db_1 | documentation about "trust":
db_1 | https://www.postgresql.org/docs/current/auth-trust.html
db_1 | In Docker's default configuration, this is effectively any other
db_1 | container on the same system.
db_1 |
db_1 | It is not recommended to use POSTGRES_HOST_AUTH_METHOD=trust. Replace
db_1 | it with "-e POSTGRES_PASSWORD=password" instead to set a password in
db_1 | "docker run".
db_1 | ********************************************************************************
杰克·戈尔的回答回答了你的问题。诊断的一种方法可能是使用已知良好的第二个容器访问
db
。请参阅docs.docker.com上的图像文档和adminer
image()的使用。其次,Dockerfile将受益于通过减少RUN
命令的数量来减少创建的层数。例如运行apt-get-update&&apt-get-y安装python-pip
(您不需要最终的apt-get-update
),谢谢!很遗憾,但我仍然不知道如何修复下一个错误。aprrka|u 1 | Traceback(最后一次调用):文件“base.py”,第5行,在conn=psycopg2.connect(“dbname='base123'user='postgres'host='db'password='pw1234')文件/usr/local/lib/python2.7/dist packages/psycopg2/u init_uuuuuuuu.py”,第130行,在connect-conn=u-connect(dsn,connection\u-factory=connection\u-factory,**kwasync)中psycopg2.OperationalError:无法连接到服务器:连接被拒绝服务器是否在主机“db”(172.20.0.2)上运行并在端口5432上接受TCP/IP连接?此错误是我回答的第二部分试图修复的。您需要将重新连接逻辑添加到代码中,或者将restart:always
添加到撰写文件中。你试过了吗?是的,我试过了。它可以工作,但是第一次尝试连接到db是不成功的。我是否需要在base.py文件中键入一些“等待时间”,以便正确连接而不出错?我想这对我的整个Docker形象来说不会“更好”,但看看它如何运行会更好。我的解决方案正确吗?是的,这是一个单独的问题,但您希望在代码中实现某种等待机制。这也会使您的数据库不安全。好吧,开枪吧。这对我来说刚刚度过难关。谢谢。