无法使用Postgres,Docker Compose和Psycopg2将主机名“ db”转换为地址

gon*_*rek 7 python postgresql psycopg2 docker docker-compose

在一个文件夹中,我有3个文件:base.py,Dockerfile和docker-compose.yml。

base.py:

import psycopg2

conn = psycopg2.connect("dbname='base123' user='postgres' host='db' password='pw1234'")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

version: '3'
services:
  db:
    image: 'postgres:latest'
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: pw1234
      POSTGRES_DB: base123
  aprrka:
    build: .    
    depends_on:
      - db
Run Code Online (Sandbox Code Playgroud)

运行后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
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会有这个错误。我暴露了端口5432。默认情况下,Compose为应用设置单个网络。每个服务都加入默认网络,我认为我的应用程序和postgres应该可以一起工作。我写错了docker-compose.yml吗?

Niv*_*ane 14

在 docker compose 文件中在同一网络上添加数据库和 Web 服务。还有链接启动db服务后db服务并启动web服务。

正确添加网络后,链接和depends_on compose 文件中的配置问题将得到修复。

配置示例:

  services:
      db:
          container_name: db
          networks:
              - djangonetwork
      web:
          depends_on:
             - db
          links:
             - db:db
          networks:
             - djangonetwork

  networks:
      djangonetwork:
          driver: bridge
Run Code Online (Sandbox Code Playgroud)

在我的 docker compose 文件中,我使用了网络名称作为“djangonetwork”,您可以使用任何其他名称。

上述配置帮助我解决了“无法翻译主机名 db”的问题。


Wag*_*aga 9

如果您使用 docker-compose 首先将此行添加到您的 .yml:

environment:
  - "POSTGRES_HOST_AUTH_METHOD=trust"
Run Code Online (Sandbox Code Playgroud)

之后,您只启动您的 db docker:

docker-compose up db
Run Code Online (Sandbox Code Playgroud)

它应该以如下消息正常启动:

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           | ********************************************************************************
Run Code Online (Sandbox Code Playgroud)


Jac*_*ore 7

问题是您不应该python base.py作为RUN指令的一部分运行。

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"]
Run Code Online (Sandbox Code Playgroud)

以上将导致主机名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
Run Code Online (Sandbox Code Playgroud)

希望这可以使您启动并运行。

  • 是的,这是一个单独的问题,但您想在代码中实现某种等待机制。 (2认同)

小智 7

如果您将此添加到您的 docker-compose.yml 中的 db 容器中,它应该可以解决问题

environment:
  - "POSTGRES_HOST_AUTH_METHOD=trust"
Run Code Online (Sandbox Code Playgroud)

  • 它还会使您的数据库不安全。 (4认同)
  • 这就像乞讨被抢劫一样。不要这样做,即使在开发环境中也不行。 (2认同)