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