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

标签 django postgresql docker docker-compose

我正在尝试在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/

相关文章:

python - 跨 Django 数据库移动大型数据集

python - 在子屏幕中显示父级 django admin python

python - Django模型继承: create sub-instance of existing instance (downcast)?

json - 将 json 转换为嵌套的 postgres 复合类型

docker - 保存 docker 容器设置,例如端口映射和卷

python - 根据 ModelChoiceField 获取 ModelMultipleChoiceField 字段的查询集

python - 在 Django 中显示来自数据库的动态数据

Python3.6函数未调用

php - Apache docker 容器 - 无效命令 'RewriteEngine'

docker - 让 docker 容器连接到网络设备