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
策略可能是更好的选择。
当我在 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
策略可能是更好的选择。