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”的问题。
如果您使用 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)
问题是您不应该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)
希望这可以使您启动并运行。
小智 7
如果您将此添加到您的 docker-compose.yml 中的 db 容器中,它应该可以解决问题
environment:
- "POSTGRES_HOST_AUTH_METHOD=trust"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16318 次 |
| 最近记录: |