Docker PostGIS 和 Django 的连接错误

Docker connection error for PostGIS and Django

当我在 Docker 中使用 运行 PostGIS 和 Django 时出现错误。我正在尝试建立一个 Django 项目来使用 PostGIS 数据库。

docker-compose.yml

version: '3'
    
services:
  db:
    image: postgis/postgis
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports: 
      - 5432:5432
  web:
    build: .
    command: bash -c "
        python manage.py makemigrations
        && python manage.py migrate
        && python manage.py runserver 0.0.0.0:8000
        "
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

Docker文件

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

错误信息:

web_1  |   File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
web_1  |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
web_1  | django.db.utils.OperationalError: could not connect to server: Connection refused
web_1  |        Is the server running on host "db" (192.168.192.2) and accepting
web_1  |        TCP/IP connections on port 5432?
web_1  | 
ht_djangoapp_web_1 exited with code 1

这很可能是时间问题:您的应用程序在数据库准备就绪之前尝试连接到数据库。这里最简单的解决方案可能是在您的应用程序容器上设置一个 restart 策略,这样 docker 将在它失败时重新启动它。您最好去掉 depends-on 指令,因为这在功能上是无用的:虽然 docker 知道数据库 container 何时启动,但它对数据库应用程序本身的状态。

  web:
    build: .
    command: bash -c "
        python manage.py makemigrations
        && python manage.py migrate
        && python manage.py runserver 0.0.0.0:8000
        "
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    restart: on-failure
      - db  web:
    build: .
    command: bash -c "
        python manage.py makemigrations
        && python manage.py migrate
        && python manage.py runserver 0.0.0.0:8000
        "
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    restart: on-failure

另一种解决方案是将脚本放入您的应用程序容器中,在启动 Web 应用程序之前显式等待数据库响应。

此解决方案的问题是您可能希望能够重新启动数据库容器(例如,升级到更新版本的 postgres),在这种情况下您的应用程序可能会再次失败,除非它有内置重新连接逻辑。使用 restart 策略可能是更好的选择。