【发布时间】: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