在一个文件夹中,我有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
希望这会让你开始运行.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。