首页 > 解决方案 > 自定义 Docker 映像在另一台机器上失败(psycopg2.OperationalError: could not translate host name to address)

问题描述

对 Docker 和 Postgres 来说绝对是新的(我知道它们之间的关系并不紧密,但请继续阅读)。

我有一个简单的 python 脚本(不是 Django 项目;不是 Kivy 项目 - 只是一个.py文件)。它获取一些东西并将其写入 Postgres 数据库(使用psycopg2)。在我的(Windows 10)机器上,(经过一百万次试验和错误才能使其正常工作)它可以工作。所以当我docker-compose up完成整个项目时,它会做它应该做的事情,并将其写入 Postgres 数据库。之后,当我Docker push将生成的映像发送到 DockerHub,然后Docker pull转到完全不相关的 Linux Azure VM 时,它失败并出现以下错误:

Traceback (most recent call last):
  File "/app/file00.py", line 19, in <module>
    conn = psycopg2.connect(
  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 "zedb" to address: Name or service not known

zedb是 Docker-compose 文件中 Postgres 数据库服务的名称(我已经粘贴在下面)。

我知道我做错了什么,但我不确定它是什么。

用于脚本的 DockerFile(它几乎是 VSCode 为您提供的默认模板):

# For more information, please refer to https://aka.ms/vscode-docker-python
FROM python:latest

# Keeps Python from generating .pyc files in the container
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Switching to a non-root user, please refer to https://aka.ms/vscode-docker-python-user-rights
RUN useradd appuser && chown -R appuser /app
USER appuser

# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
CMD ["python", "file00.py"]

db 部分不包含 Dockerfile,而是init.sql创建脚本写入所需的表的文件。它从本地安装到 docker-compose 文件中的 Postgres 映像。据我了解,如果容器以某种方式失败/关闭,则表中的数据将被保留(卷持久性),并且当容器再次启动时,将创建表。这是init.sql文件中的内容:

CREATE TABLE IF NOT EXISTS pt (
    serial_num SERIAL, 
    col1 VARCHAR (40) NOT NULL PRIMARY KEY, 
    col2 VARCHAR (150) NOT NULL
 );

关于这一切,我可能在很多层面上都错了,但是没有人可以检查,我正在自己学习这一切。

最后,这是docker-compose文件。

version: '3'

services:
  zedb:
    image: 'postgres'
    environment: 
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=user123!
      - POSTGRES_DB=fkpl
      - PGDATA=/var/lib/postgresql/data/db-files/
    expose: 
      - 5432
    ports: 
      - 5432:5432
    volumes: 
      - ./db/:/var/lib/postgresql/data/
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql

  zescript:
    build: ./app 
    volumes:
      - ./app:/usr/scr/app
    depends_on: 
      - zedb

任何帮助是极大的赞赏。

标签: pythonpostgresqldockerdocker-compose

解决方案


推荐阅读