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

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

base.py:

import psycopg2

conn = psycopg2.connect("dbname='base123' user='postgres' host='db' password='pw1234'")

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

泊坞窗,compose.yml:

version: '3'
services:
  db:
    image: 'postgres:latest'
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: pw1234
      POSTGRES_DB: base123
  aprrka:
    build: .    
    depends_on:
      - db

在我运行docker-compose之后,我收到以下错误

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

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

解决方法:

问题是你不应该运行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"]

以上应该导致解析主机名db.但是,如果您的python代码没有用于连接到数据库的任何重新连接逻辑,则容器可能仍会出错.这是因为postgres容器将运行,但数据库不准备接受连接.

这可以通过添加restart来永久修复:始终到你的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是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...