python - DJANGO与docker和PostgreSQL

标签 python django postgresql docker docker-compose

我是Docker的新手,并且在docker上玩耍以了解更多信息。
这是我的Dockerfile

FROM python:3.8.3-alpine

#set the working directory for the container
WORKDIR /user/src/app/

#set the env variables
ENV PYTHONBUFFERED=1
ENV PYTHONWRITEBYCODE=1

# install psycopg2 dependencies
RUN apk update \
    && apk add postgresql-dev gcc python3-dev musl-dev 
    
RUN pip install psycopg2-binary

RUN apk add zlib-dev jpeg-dev gcc musl-dev
#install pip for the docker image
RUN pip install --upgrade pip

#copy the requirement from local system to docker image inside /user/src/app/
COPY ./requirements.txt .
RUN pip install -r requirements.txt

#copy the complete project files after installing dependencies.
COPY . .


ENTRYPOINT ["/user/src/app/entrypoint.sh"]
第二个是entrypoint.sh
#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $DB_HOST $DB_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

# python manage.py flush --no-input
# python manage.py migrate

exec "$@"
最后一个 docker-compose.yml
version: "3.8"
   
services:
  db:
    image: postgres:12.4-alpine
    environment:
      - POSTGRES_DB=demo_1
      - POSTGRES_USER=***
      - POSTGRES_PASSWORD=***
    volumes:
      - postgres_data:/var/lib/postgresql/data/

  web:
    build: 
      context: .
      dockerfile: Dockerfile 
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/user/src/app/
    ports:
      - "8000:8000"
    depends_on:
      - db
    env_file: 
      - ./.env

volumes: 
  postgres_data:
我可以运行PostgreSQL并使用docker中的这些文件在8000端口建立服务器。
现在,尽管添加了Postgres,但只要在.env文件中未将DATABASE环境变量设置为Postgres,我们仍然可以为Django创建独立的Docker镜像。
这怎么可能?
我尝试了以下代码
$ docker run -d \
    -p 8006:8000 \
    -e "SECRET_KEY=please_change_me" -e "DEBUG=1" -e "DJANGO_ALLOWED_HOSTS=*" \
    hello_django python /usr/src/app/manage.py runserver 0.0.0.0:8000
但是我无法使用http:localhost:8006启动服务器
.env文件或其他文件中需要整体进行哪些更改?
另外我的.env file
SECRET_KEY = *********
DB_NAME = demo_1
DEBUG = 1
DB_USER = *****
DB_PASSWORD = ***********
DB_HOST = db
DB_PORT = 5432
ALLOWED_HOSTS=.localhost, .amazonaws.com
DATABASE = postgres
settings.py文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': config('DB_NAME'),
        'USER': config('DB_USER'),
        'PASSWORD': config('DB_PASSWORD'),
        'HOST': config('DB_HOST'),
        'PORT': config('DB_PORT', cast=int)
    }
}

我需要删除entrypoint.sh文件吗?或删除DATABASE=postgres以在端口8000以外的本地主机:8006中运行服务器的其他实例

最佳答案

这可能不是唯一的问题,但是请注意我是如何将ENGINE值更改为'django.db.backends.postgresql_psycopg2'的,因为您正在使用psycopg2。我不记得确切的原因,但这与您使用的python-alpine图像有关,前一段时间我也遇到了类似的问题。
在这里,我将'db'用作数据库HOST,因为那是我的docker-compose.yml文件中的服务名称,但是您执行该操作的方式也应该可以。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'HOST': 'db',
        'PORT': 5432,
        'NAME': os.environ.get('POSTGRES_DB'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD')
    }
}
另外,我不太了解您的问题,但是我发现这是错误的。

关于python - DJANGO与docker和PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64172830/

相关文章:

python - 同行重置 Django 连接

java - JDBC API 和 PostgreSQL 驱动程序有什么区别?

python - 在 Python 中使用 Pandas Dataframes 对数据进行排序

python - 如何裁剪 Keras 中图层返回的值?

python - Django 子域

postgresql - Postgres : Setting the value of an array with a subquery?

java - 使用 postgres 进行 hibernate 配置(使用 webnms)

python - 如何从带有日期时间字段的 Django 模型中获取每个不同的 'year' 值?

python - 如何将一个字段显示为序列化器中的字符串?

html 输入标签中的 Python/Django 日期字段