繁体   English   中英

带有 docker 和 postgresql 的 DJANGO

[英]DJANGO with docker and postgresql

我是 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:

我能够运行 Postgres 并使用 docker 中的这些文件在端口 8000 中构建服务器。

现在,尽管添加了 Postgres,我们仍然可以为 Django 创建一个独立的 Docker 镜像,只要 .env 文件中的 DATABASE 环境变量没有设置为 Postgres。

这怎么可能?

我尝试了以下代码

$ 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以在 localhost:8006 除了端口 8000 之外运行不同的服务器实例

这可能不是唯一的问题,但请注意我如何将ENGINE值更改为'django.db.backends.postgresql_psycopg2' ,因为您使用的是psycopg2 我不记得这个的确切原因,但这与您使用的是python-alpine图像有关, 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')
    }
}

另外,我并没有真正理解您的问题,但这是我看到的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM