gpt4 book ai didi

django - Docker镜像未运行,数据库错误:django.db.utils.OperationalError无法将主机名 “postgres”转换为地址:名称或服务未知

转载 作者:行者123 更新时间:2023-12-02 20:41:28 28 4
gpt4 key购买 nike

因此,我设法使用docker-compose build在本地构建了Docker镜像,并将该镜像推送到了Docker Hub存储库。
现在,我正在尝试使其在DigitalOcean上运行,以便可以托管它。我已经提取了正确版本的镜像,并尝试使用以下命令运行它:root@my-droplet:~# docker run --rm -it -p 8000:8000/tcp mycommand/myapp:1.1(是,1.1)
但是我很快遇到了这两个错误:

...
File "/usr/local/lib/python3.8/dist-packages/django/db/backends/postgresql/base.py",
line 185, in get_new_connection
connection = Database.connect(**conn_params) File "/usr/local/lib/python3.8/dist-packages/psycopg2/__init__.py", line
127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "postgres" to address: Name or service not known ```

... 
File "/usr/local/lib/python3.8/dist-packages/django/db/backends/base/base.py",
line 197, in connect
self.connection = self.get_new_connection(conn_params) File "/usr/local/lib/python3.8/dist-packages/django/utils/asyncio.py", line
26, in inner
return func(*args, **kwargs) File "/usr/local/lib/python3.8/dist-packages/django/db/backends/postgresql/base.py",
line 185, in get_new_connection
connection = Database.connect(**conn_params) File "/usr/local/lib/python3.8/dist-packages/psycopg2/__init__.py", line
127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known ```

这可能是由于我将应用程序(使用 docker-compose,yml)分为两个服务,并且仅从 previous post开始就推送了应用程序的镜像。这是我的 docker-compose.yml文件:
这是我的docker-compose.yml文件:
version: '3'

services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=(adminname)
- POSTGRES_PASSWORD=(adminpassword)
- CLOUDINARY_URL=(cloudinarykey)
app:
build: .
ports:
- "8000:8000"
depends_on:
- db
这是我的Dockerfile:
FROM (MY FRIENDS ACCOUNT)/django-npm:latest

RUN mkdir usr/src/mprova

WORKDIR /usr/src/mprova

COPY frontend ./frontend
COPY backend ./backend

WORKDIR /usr/src/mprova/frontend

RUN npm install
RUN npm run build

WORKDIR /usr/src/mprova/backend

ENV DJANGO_PRODUCTION=True
RUN pip3 install -r requirements.txt

EXPOSE 8000

CMD python3 manage.py collectstatic && \
python3 manage.py makemigrations && \
python3 manage.py migrate && \
gunicorn mellon.wsgi --bind 0.0.0.0:8000
这是我的 settings.py文件的片段:
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'admin',
'PASSWORD': '[THE PASSWORD]',
'HOST': 'db',
'PORT': 5432,
}
}
...
如何解决此问题?我环顾四周,但看不到我做错了什么。

从网上看到的内容,我向项目添加了以下内容,但它也不起作用:
这是我的 base.py(新文件):
import psycopg2

conn = psycopg2.connect("dbname='postgres' user='admin' host='db' password='[THE PASSWORD]'")
Dockerfile的补充:
FROM (MY FRIENDS ACCOUNT)/django-npm:latest

RUN pip3 install psycopg2-binary

COPY base.py base.py

RUN python3 base.py

...
但是由于以下错误,构建失败:
Traceback (most recent call last):   File "base.py", line 3, in
<module>
conn = psycopg2.connect("dbname='postgres' user='admin' host='db' password='[THE PASSWORD]'")
File "/usr/local/lib/python3.8/dist-packages/psycopg2/__init__.py", line
127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync) psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host "db" ([SOME-IP-ADDRESS]) and accepting
TCP/IP connections on port 5432?

ERROR: Service 'app' failed to build: The command '/bin/sh -c python3 base.py' returned a non-zero code: 1
me@My-MacBook-Pro-5 mellon %

我不确定下一步该怎么做,但我觉得自己犯了一个简单的错误。为什么现在拒绝连接?

最佳答案

当您启动docker-compose.yml文件时,Compose将自动为您创建一个Docker网络并将容器连接到该网络。如果文件中没有任何特定的networks:声明,则Compose将命名网络default,然后Compose创建的大多数内容都以当前目录名作为前缀。此设置在Networking in Compose中有更详细的描述。docker run根本不查看“撰写”设置,因此,您对docker run手动执行的任何操作都需要复制docker-compose.yml具有或将自动生成的设置。要使docker run容器连接到Compose网络,您需要执行以下操作:

docker network ls              # looking for somename_default
docker run \
--rm -it -p 8000:8000/tcp \
--net somename_default \ # <-- add this option
mycommand/myapp:1.1
(特定的错误消息 could not translate host name "postgres" to address暗示了Docker网络设置问题:数据库客户端容器与数据库服务器不在同一网络上,因此主机名解析失败。与“连接被拒绝”类型的错误相反,这表明一个错误容器正在查找另一个,但是数据库尚未运行或端口号错误。)
docker build示例中,Dockerfile中的代码永远无法连接到数据库。从机械的 Angular 来看,没有办法像使用 docker run那样将其连接到Docker网络。从概念上讲,构建图像会产生可重用的伪像。如果我将镜像 docker push到注册表并在另一台主机 docker run上,它将没有数据库设置,或者类似地,如果我在本地删除并重新创建数据库容器。

关于django - Docker镜像未运行,数据库错误:django.db.utils.OperationalError无法将主机名 “postgres”转换为地址:名称或服务未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63216785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com