【问题标题】:psycopg2.OperationalError: could not translate host name to address using psycopg2 and dockerpsycopg2.OperationalError:无法使用 psycopg2 和 docker 将主机名转换为地址
【发布时间】:2021-03-22 17:43:01
【问题描述】:

我已经尝试了几个小时,但类似问题的解决方案似乎对我没有用... 我正在使用 docker-compose 设置一个 postgresql 数据库并运行一个 python 网络服务器,我想从该服务器连接到我的 postgressql 数据库(所以它在容器内运行)

version: '3.8'

services:
  database:
    container_name: database
    hostname: database
    image: postgres
    restart: always
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - postgres:/pgdata
      - ./application/ressources/fixtures.sql:/docker-entrypoint-initdb.d/fixtures.sql 
    ports:
      - "5432:5432"

  application:
    container_name: application
    build: .
    ports:
      - "5001:5001"
    volumes: 
      - ./application:/application
    restart: always
    depends_on:
      - database

volumes:
    postgres:

我尝试按如下方式连接(我已经读到尽管 depends on 在我的 dockerfile 中,但数据库需要更多时间才能接受连接,因此我添加了重试逻辑):


        retries = 0
        while retries < 5:
            retries = retries + 1
            self.conn = psycopg2.connect(user='postgres', password='password',
                                         host='database', port="5432", database='mydatabase')
            if not self.conn:
                logging.info("retry to connect")
                sleep(5)

奇怪的是,当使用 docker-compose -f docker-compose.yml up 运行它时,一切正常。 但是当我构建映像 (docker build -t myapp:0.1) 并运行它 (docker run myapp:0.1) 时,它给了我以下错误:

File "/application/libraries/database.py", line 18, in establishConnection
    self.conn = psycopg2.connect(user=CONFIG.DATABASE_USER, password=CONFIG.DATABASE_PASSWORD,
  File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "database" to address: Name or service not known

我已经读过,当使用 docker-compose 时会创建一个网络,所以这不可能是这里的错误我猜Docker Compose doku

提前致谢, 杰基

【问题讨论】:

  • 当进入容器并执行主机名时,它会打印数据库,因此主机名设置正确......

标签: python python-3.x postgresql docker docker-compose


【解决方案1】:

如果您在图像上运行docker run,它只会执行该命令行上的内容,而不会执行更多操作。特别是,普通的 docker 命令不知道 docker-compose.yml 以及您可能在那里指定的任何设置。

简短的回答是始终使用docker-compose up 来启动容器。

原则上,您可以将docker-compose.yml 文件转换为明确的docker 命令。您至少需要手动创建一个 Docker 网络并指定容器名称:

docker network create app-net
docker run -d --net app-net --name database -p 5432:5432 postgres
docker run -d --net app-net -e PGHOST=database -p 5001:5001 myapp:0.1

不过,这并未包括 Compose 设置中的其他选项,尤其是数据库持久性。有足够多的设置需要您将它们写在一个文件中,此时您基本上已经重构了 Compose 环境。

【讨论】:

  • 首先感谢您的回复 - 我的问题是:我使用 github 操作(ci/cd 管道)在推送到存储库时自动创建图像......所以我现在想从主机我想在哪里运行我的容器我从 github 包中提取该图像(包括我在 docker-compose 文件中定义的所有步骤)并运行该图像。还是我理解有问题?
  • 该镜像不包含docker-compose.yml文件中的任何步骤,只有一个特定的build:块和对应的Dockerfile。
  • 好吧,所以我只能从单个 docker 文件构建图像 - 所以 docker-compose 文件不能在 ci/cd 管道中使用?
  • 您可以docker-compose build 图像和docker-compose push 它们,但这仅包含构建的图像,而不包含有关如何运行它们的说明。
  • 我想我误解了如何使用 docker 构建应用程序的概念。所以我认为我应该在一个容器中运行我的 python 脚本,在另一个容器中运行数据库。仍然不确定,在本地编程然后在生产服务器上运行时生产流程如何,但我希望我能弄清楚。感谢您的帮助:)
猜你喜欢
  • 2020-01-16
  • 2019-01-15
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多