【问题标题】:DJANGO with docker and postgresql带有 docker 和 postgresql 的 DJANGO
【发布时间】:2020-10-02 13:58:19
【问题描述】:

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

我可以使用 docker 中的这些文件运行 Postgres 并在端口 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

【问题讨论】:

  • PORT 8006 来自哪里?我没有在您的 dockerfile 或 docker-compose 中看到它的定义。
  • 我们需要为其他人定义它吗?如果有人想像我们在 jenkins 中那样在不同的端口使用它怎么办?
  • 对不起,我应该更好地措辞我的问题。是否要将本地 docker 端口 8000 转发到 8006 端口?
  • 是的,我的意思是像我们在 jenkins 中那样共享端口
  • 你能澄清一下你遇到的具体问题吗?您在启动时是否遇到错误或其他错误?

标签: python django postgresql docker docker-compose


【解决方案1】:

这可能不是唯一的问题,但请注意我如何将 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')
    }
}

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

【讨论】:

  • $ docker run -d \ > -p 8006:8000 \ > -e "SECRET_KEY=please_change_me" -e "DEBUG=1" -e "DJANGO_ALLOWED_HOSTS=*" \ > hello_django_2 python /user/ src/app/manage.py 运行服务器 0.0.0.0:8000 6167031f6ee9c3aa7a08754f980d080d7bba6669824f603266a062b0f3d5aac1
  • 我一直在终端上收到这个长键。不知道怎么回事……为什么我的容器没有启动……也许我需要为新端口构建新映像……不确定
  • 您能在此处粘贴您用来启动容器的确切命令吗? (使用this to encapsulate it,这样我可以更好地阅读它。
  • $ docker run -d \ > -p 8006:8000 \ > -e "SECRET_KEY=please_change_me" -e "DEBUG=1" -e "DJANGO_ALLOWED_HOSTS=*" \ > hello_django_2 python /user/src/app/manage.py runserver 0.0.0.0:8000
  • 为什么终端在执行后返回一个长字符串? 41a78fc596044c0b8b7fa93e57063155c37c19e09ca1d2ecb648513649428f33
猜你喜欢
  • 2021-11-13
  • 2019-03-22
  • 2017-04-18
  • 1970-01-01
  • 2012-08-17
  • 2014-12-05
  • 2021-06-18
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多