gpt4 book ai didi

django - docker-compose django应用程序找不到Postgresql数据库

转载 作者:行者123 更新时间:2023-12-02 21:00:18 25 4
gpt4 key购买 nike

我正在尝试在Docker容器中创建Django应用。该应用程序将使用具有postgis扩展名的postgres数据库,该数据库在另一个数据库中。我正在尝试使用docker-compose解决此问题,但无法使其正常工作。

我可以在没有容器的情况下使应用程序正常工作,而将容器容器化就很好了。我还可以使用sqlite db使该应用程序在容器中运行(因此,包含的文件没有外部容器依赖性)。无论我做什么,它都找不到数据库。

我的docker-compose文件:

version: '3.7'

services:
postgis:
image: kartoza/postgis:12.1
volumes:
- postgres_data:/var/lib/postgresql/data/
ports:
- "${POSTGRES_PORT}:5432"
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
env_file:
- .env
web:
build: .
# command: sh -c "/wait && python manage.py migrate --no-input && python /code/app/manage.py runserver 0.0.0.0:${APP_PORT}"
command: sh -c "python manage.py migrate --no-input && python /code/app/manage.py runserver 0.0.0.0:${APP_PORT}"
# restart: on-failure
ports:
- "${APP_PORT}:8000"
volumes:
- .:/code
depends_on:
- postgis
env_file:
- .env
environment:
WAIT_HOSTS: 0.0.0.0:${POSTGRES_PORT}
volumes:
postgres_data:
name: ${POSTGRES_VOLUME}

我的(应用程式的)Dockerfile:
# Pull base image
FROM python:3.7
LABEL maintainer="yb.leeuwen@portofrotterdam.com"

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install dependencies
# RUN pip install pipenv
RUN pip install pipenv
RUN mkdir /code/
COPY . /code
WORKDIR /code/
RUN pipenv install --system
# RUN pipenv install pygdal

RUN apt-get update &&\
apt-get install -y binutils libproj-dev gdal-bin python-gdal python3-gdal postgresql-client


## Add the wait script to the image
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait
RUN chmod +x /wait

# set work directory
WORKDIR /code/app
# RUN python manage.py migrate --no-input
# CMD ["python", "manage.py", "migrate", "--no-input"]
# RUN cd ${WORKDIR}

# If we want to run docker by itself we need to use below
# but if we want to run from docker-compose we'll set it there
EXPOSE 8000

# CMD /wait && python manage.py migrate --no-input
# CMD ["python", "manage.py", "migrate", "--no-input"]
# CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

我的.env文件:
# POSTGRES
POSTGRES_PORT=25432
POSTGRES_USER=username
POSTGRES_PASSWORD=pass
POSTGRES_DB=db
POSTGRES_VOLUME=data
POSTGRES_HOST=localhost

# GEOSERVER


# DJANGO
APP_PORT=8000

最后是我在Django应用程序的settings.py中:
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': os.getenv('POSTGRES_DBNAME'),
'USER': os.getenv('POSTGRES_USER'),
'PASSWORD': os.getenv('POSTGRES_PASS'),
'HOST': os.getenv("POSTGRES_HOST", "localhost"),
'PORT': os.getenv('POSTGRES_PORT')
}
}

我已经尝试了很多事情(如您在一些评论中看到的)。我意识到docker-compose似乎并没有等到postgres完全启动,旋转并接受请求之后,才尝试建立一个等待功能(如网站上所建议)。我首先进行了迁移,并在Dockerfile中运行了服务器(在构建过程中进行迁移,在启动命令runserver中进行了迁移),但这需要postgres,因为它没有在等待,所以没有运行。我终于将所有内容都带到了docker-compose.yml文件中,但仍然无法正常工作。

我得到的错误:
web_1      |    Is the server running on host "localhost" (127.0.0.1) and accepting
web_1 | TCP/IP connections on port 25432?
web_1 | could not connect to server: Cannot assign requested address
web_1 | Is the server running on host "localhost" (::1) and accepting
web_1 | TCP/IP connections on port 25432?

有人知道为什么这不起作用吗?

最佳答案

我在django应用的settings.py中看到,您通过以下方式连接到Postgres

'HOST': os.getenv("POSTGRES_HOST", "localhost"),

.env中,您将to的值 POSTGRES_HOST设置为 localhost。这意味着 web容器正在尝试到达本地主机上的Postgres服务器 postgis,事实并非如此。

为了解决此问题,只需将 .env文件更新为如下所示:
POSTGRES_PORT=5432
...
POSTGRES_HOST=postgis
...

原因是在您的情况下, docker-compose带来了2个容器:相同Docker网络中的 postgisweb,它们可以通过其DNS名称即 postgisweb相互访问。

关于端口, web容器可以在端口 postgis处到达 5432,但不能到达 25432,而您的主机可以在端口 25432处到达数据库,但不能在 5432处到达数据库。

关于django - docker-compose django应用程序找不到Postgresql数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60727353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com