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

时间:2020-10-17 10:12:14

标签: 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时,将字符串命令更改为:

command: bash -c "python manage.py runserver 0.0.0.0:8000"

一切都很好。因此,迁移行破坏了我的代码,但我不知道为什么。

我尝试创建一个空的django项目来检查相同的配置。在第一个“ docker-compose up”上,所有程序都开始正常运行,但是从第二个开始,所有程序又因相同的错误而中断。随着时间的流逝,这个问题从测试项目中消失了,我不知道为什么,maby缓存之类的东西。

新信息

  1. 在docer-compose.yaml中使用命令docker-compose up运行command: bash -c "python manage.py runserver 0.0.0.0:8000"并捕获错误。

  2. 然后按Ctrl + C(从docker退出,组成“ shell”),但不要执行docker-compose down,因为此命令将删除创建的容器。

  3. 在docer-compose.yaml中使用命令docker-compose up运行command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000",所有操作均已成功启动。

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

1 个答案:

答案 0 :(得分:1)

根据您的编辑,您没有任何网络问题。

问题在于您的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"

如果您的映像未安装此软件包,请向您的Dockerfile添加apt install wait-for-it