Docker映像未运行,数据库错误:django.db.utils.OperationalError无法将主机名“postgres”转换为地址:名称或服务未知
因此,我已经设法使用Docker compose build在本地构建我的Docker映像,并将该映像推送到我的Docker Hub存储库 现在我想让它在DigitalOcean上运行,这样我就可以主持它了。我已提取了正确版本的图像,并尝试使用以下命令运行它: root@my-droplet:~docker run-rm-it-p8000:8000/tcp mycommand/myapp:1.1是的,1.1 然而,我很快就遇到了以下两个错误: 这可能是因为我使用docker compose,yml将我的应用程序分为两个服务,并且在我发布应用程序后只推送了应用程序的图像。这是我的docker-compose.yml文件: 这是我的docker-compose.yml文件: 版本:“3” 服务: db: 图片:博士后 环境: -POSTGRES_DB=POSTGRES -POSTGRES_USER=adminname -POSTGRES_PASSWORD=adminpassword -CLOUDINARY\u URL=cloudinarykey 应用程序: 生成:。 端口: - 8000:8000 取决于: -分贝 这是我的Dockerfile:Docker映像未运行,数据库错误:django.db.utils.OperationalError无法将主机名“postgres”转换为地址:名称或服务未知,django,postgresql,docker,dockerfile,digital-ocean,Django,Postgresql,Docker,Dockerfile,Digital Ocean,因此,我已经设法使用Docker compose build在本地构建我的Docker映像,并将该映像推送到我的Docker Hub存储库 现在我想让它在DigitalOcean上运行,这样我就可以主持它了。我已提取了正确版本的图像,并尝试使用以下命令运行它: root@my-droplet:~docker run-rm-it-p8000:8000/tcp mycommand/myapp:1.1是的,1.1 然而,我很快就遇到了以下两个错误: 这可能是因为我使用docker compose,ym
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
下面是my settings.py文件的一个片段:
如何解决此问题?我环顾四周,但看不出我做错了什么
根据我在网上看到的情况,我在我的项目中添加了以下内容,但它也不起作用:
这是我的base.py新文件:
导入psycopg2
conn=psycopg2.connectdbname='postgres'user='admin'host='db'password='[密码]'
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
但由于以下错误,生成失败:
我不确定下一步该做什么,但我觉得我犯了一个简单的错误。为什么现在连接被拒绝
我正在尝试使用以下命令运行它:root@my-液滴:~
docker run-rm-it-p 8000:8000/tcp mycommand/myapp:1.1是,1.1
Docker compose允许创建多个容器的组合。
使用docker run运行django容器违背了它的目的
您想要的是运行:
docker-compose build
docker-compose up
或在单个命令中:
docker-compose up --build
为什么现在连接被拒绝
也许是因为这不是在适当的时候做的
我不是Django专家,但您的第二次尝试看起来不错,而Django服务在我假设的撰写声明键入错误中遗漏了Dockerfile属性
第一次尝试时,会出现以下错误:
django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known ```
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?
这意味着django使用postgres作为数据库的主机。
但是根据您的compose,可以使用名为db的主机访问数据库。这些不匹配
关于定义数据库属性的第二次尝试,它看起来不错,而且还与以下内容匹配:
在本节中,您将为Django设置数据库连接
在项目目录中,编辑composeexample/settings.py文件
替换数据库=。。。以下是:
设置.py
第二次尝试时,请注意以下错误:
django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known ```
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?
这可能意味着当Django尝试初始化与的连接时,Postgres DB侦听器尚未准备就绪
compose:的属性依赖于:定义容器启动的顺序,但不等待容器后面的应用程序准备就绪
这里有两种解决这种情况的方法:
在启动django服务之前,请添加几秒钟的睡眠时间
或者将django compose配置设置为在失败时重新启动。
对于第一种方法,请使用CMD配置django服务,例如not Tryed:
app:
build: .
ports:
- "8000:8000"
depends_on:
- db
command: /bin/bash -c "sleep 30; python3 manage.py collectstatic && python3 manage.py makemigrations && python3 manage.py migrate && gunicorn mellon.wsgi --bind 0.0.0.0:8000 "
对于第二种方法,请尝试以下方法:
app:
build: .
ports:
- "8000:8000"
depends_on:
- db
restart: on-failure
我正在尝试使用以下命令运行它:root@my-液滴:~
docker run-rm-it-p 8000:8000/tcp mycommand/myapp:1.1是,1.1
Docker compose允许创建多个容器的组合。
使用docker run运行django容器违背了它的目的
您想要的是运行:
docker-compose build
docker-compose up
或在单个命令中:
docker-compose up --build
为什么现在连接被拒绝
也许是因为这不是在适当的时候做的
我不是Django专家,但您的第二次尝试看起来不错,而Django服务在我假设的撰写声明键入错误中遗漏了Dockerfile属性
第一次尝试时,会出现以下错误:
django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known ```
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?
这意味着django使用postgres作为数据库的主机。
但是根据您的compose,可以使用名为db的主机访问数据库。这些不匹配
关于定义数据库属性的第二次尝试,它看起来不错,而且还与以下内容匹配:
在本节中,您将为Django设置数据库连接
在项目目录中,编辑composeexample/settings.py文件
替换数据库=。。。以下是:
设置.py
第二次尝试时,请注意以下错误:
django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known ```
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?
这可能意味着当Django尝试初始化与的连接时,Postgres DB侦听器尚未准备就绪
compose:的属性取决于:定义容器启动的顺序,但不等待应用程序启动
准备好容器后面的离子
这里有两种解决这种情况的方法:
在启动django服务之前,请添加几秒钟的睡眠时间
或者将django compose配置设置为在失败时重新启动。
对于第一种方法,请使用CMD配置django服务,例如not Tryed:
app:
build: .
ports:
- "8000:8000"
depends_on:
- db
command: /bin/bash -c "sleep 30; python3 manage.py collectstatic && python3 manage.py makemigrations && python3 manage.py migrate && gunicorn mellon.wsgi --bind 0.0.0.0:8000 "
对于第二种方法,请尝试以下方法:
app:
build: .
ports:
- "8000:8000"
depends_on:
- db
restart: on-failure
启动docker-compose.yml文件时,compose将自动为您创建docker网络并将容器附加到其中。缺少任何特定的网络:文件中的声明,Compose将命名为网络默认值,然后Compose创建的大多数内容都以当前目录名作为前缀。有关此设置的详细信息,请参阅
docker run根本不查看Compose设置,因此手动使用docker run执行的任何操作都需要复制docker-Compose.yml已经或将自动生成的设置。要使docker run容器连接到Compose网络,需要执行以下操作:
docker network ls正在查找somename\u默认值
码头工人赛跑\
-rm-it-p 8000:8000/tcp\
-net somename_default\启动docker-compose.yml文件时,compose将自动为您创建docker网络并将容器附加到其中。缺少任何特定的网络:文件中的声明,Compose将命名为网络默认值,然后Compose创建的大多数内容都以当前目录名作为前缀。有关此设置的详细信息,请参阅
docker run根本不查看Compose设置,因此手动使用docker run执行的任何操作都需要复制docker-Compose.yml已经或将自动生成的设置。要使docker run容器连接到Compose网络,需要执行以下操作:
docker network ls正在查找somename\u默认值
码头工人赛跑\
-rm-it-p 8000:8000/tcp\
-net somename\u default\n我错过了运行部分。很好的解释:当我使用docker卷ls时,没有可用的卷。为什么会这样?我是说docker network ls,对不起;“我已经搞定了答案。”大卫马兹,谢谢你。有三个选项:桥接、主机和无。如何知道要选择哪一个?如果您运行了docker compose up-d,那么应该有一个名为somename\u default的目录,其中somename是当前目录的名称。用那个,我错过了跑步部分。很好的解释:当我使用docker卷ls时,没有可用的卷。为什么会这样?我是说docker network ls,对不起;“我已经搞定了答案。”大卫马兹,谢谢你。有三个选项:桥接、主机和无。如何知道要选择哪一个?如果您运行了docker compose up-d,那么应该有一个名为somename\u default的目录,其中somename是当前目录的名称。用那个。