【问题标题】:Docker connection error for PostGIS and DjangoPostGIS 和 Django 的 Docker 连接错误
【发布时间】:2020-09-13 14:01:52
【问题描述】:

我在 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

Dockerfile

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

【问题讨论】:

  • 你能从 docker 主机连接到数据库吗? --- 你在哪里为 web 容器配置数据库连接?
  • 你运行什么来产生那个错误信息?如果只是docker-compose up -d,那么等待 30-60 秒再试一次有用吗?

标签: django postgresql docker docker-compose postgis


【解决方案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 策略可能是更好的选择。

【讨论】:

    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多