Docker连接PostGIS和Django时出现错误

3

我在使用Docker中运行PostGIS和Django时遇到了错误。我正在尝试设置Django项目来使用PostGIS数据库。

docker-compose.yml

->

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容器配置数据库连接? - Turing85
你运行了什么来产生那个错误信息?如果只是docker-compose up -d,等待30-60秒然后再尝试一次会起作用吗? - David Maze
1个回答

4
很可能是一个时间问题:您的应用程序在数据库准备好之前尝试连接到数据库。这里最简单的解决方案可能就是在应用程序容器上设置 restart 策略,这样 Docker 在失败时将重启它。您也可以摆脱 depends-on 指令,因为它在功能上没有用处:虽然 Docker 知道数据库 容器 何时启动,但它对数据库应用本身的状态一无所知。
  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策略可能是更好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接