Python 无法翻译主机名“;db";要解决使用Postgres、Docker Compose和Psycopg2的问题

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

在一个文件夹中,我有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-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形象来说不会“更好”,但看看它如何运行会更好。我的解决方案正确吗?是的,这是一个单独的问题,但您希望在代码中实现某种等待机制。这也会使您的数据库不安全。好吧,开枪吧。这对我来说刚刚度过难关。谢谢。