django - Docker和Django。 django.db.utils.OperationalError:无法连接到服务器

标签 django docker docker-compose

我找不到解决方案,请帮忙!
我有 Dockerfile

FROM python:3

ENV PYTHONUNBUFFERED=1

RUN mkdir /app
WORKDIR /app

RUN pip install Django \
    && pip install psycopg2 \
    && pip install jinja2 \
    && pip install Pillow

COPY . /app/
还有 docker-compose.yaml
version: "3"

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=folivora
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - 5432:5432

  site:
    image: folivora:latest
    command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    depends_on:
      - db
    ports:
      - 8000:8000
还有 settings.py
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'folivora',
    'USER': 'postgres',
    'PASSWORD': 'postgres',
    'HOST': 'db',
    'PORT': '5432',
}
}
并且在运行“docker-compose up”时出现错误
site_1  | django.db.utils.OperationalError: could not connect to server: Connection refused
site_1  |   Is the server running on host "db" (192.168.224.2) and accepting
site_1  |   TCP/IP connections on port 5432?
当我编辑docker-compose.yaml时,将string命令更改为:
command: bash -c "python manage.py runserver 0.0.0.0:8000"
一切都很好。因此,迁移行破坏了我的代码,但我不知道为什么。
我尝试创建一个空的django项目来检查相同的配置。在第一个“docker-compose up”上,所有程序都开始正常运行,但是从第二个开始,所有程序又因相同的错误而中断。随着时间的流逝,这个问题从测试项目中消失了,我不知道为什么,maby缓存之类的东西。
新信息
  • 在docer-compose.yaml中使用docker-compose up命令运行command: bash -c "python manage.py runserver 0.0.0.0:8000"并捕获错误。
  • 然后按Ctrl + C(从docker退出,组成“shell”),但不执行docker-compose down,因为此命令删除了创建的容器。
  • 在docer-compose.yaml中使用docker-compose up命令运行command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000",所有操作均已成功启动。

  • 我认为这是不好的解决方案。

    最佳答案

    根据您的编辑,您没有任何网络问题。
    问题是您的Django应用程序在数据库实际运行之前就开始调用迁移命令(您可以在postgres日志中进行检查)。还要注意,depends_to仅管理容器的创建顺序,而不管理容器的就绪状态。
    您可以使用wait-for-it等到您的postgres端口可用。因此,您的command将为:

    bash -c "wait-for-it db:5432 -- python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    
    如果您的镜像未安装此软件包,则将apt install wait-for-it添加到您的Dockerfile中。

    关于django - Docker和Django。 django.db.utils.OperationalError:无法连接到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64401309/

    相关文章:

    python - Django 评论

    Django 从一个表单创建多个对象(同一模型)

    node.js - Bitbucket Pipelines - 访问另一个容器

    ruby-on-rails - Rails docker中的delay_job无法正常工作

    python - Django接受QueryParams(必须是可调用错误)

    python - Tastypie 。如何添加响应的执行时间?

    Docker快速入门终端。无法启动虚拟机

    jenkins - 使用 Jenkins 在 Docker 容器中运行测试

    azure - "ACI integration does not support labels in compose applications"但我没有指定任何服务标签

    docker - 为什么docker容器更新不稳定?