【发布时间】:2019-05-02 22:58:57
【问题描述】:
我一直在尝试寻找使用 Docker 设置 Django 项目的最佳方法。但是对于 CMD 和 ENTRYPOINT 与 compose 命令的关系,我有些困惑。
当我第一次设置项目时,我需要运行 createsuperuser 并迁移数据库。我尝试使用脚本将命令作为 Dockerfile 中的入口点运行,但它似乎并不能始终如一地工作。我切换到下面显示的配置,在我的 compose 文件中使用命令覆盖 Dockerfile CMD,告诉它运行 makemigrations、migrate 和 createsuperuser。
我遇到的问题是如何设置它,以便它满足我的需要。如果我在撰写文件中设置命令(如代码中注释掉的那样),它应该根据我的理解覆盖我的 Dockerfile 中的 CMD。
我不确定是否需要在我的 Dockerfile 中使用 ENTRYPOINT 或 CMD 来实现这一点?由于 CMD 被我的 compose 文件覆盖而 ENTRYPOINT 没有,如果将其设置为 ENTRYPOINT 会不会导致问题,因为它会在 compose 命令执行后再次尝试运行 gunicorn?
与使用入口点脚本相比,这种方法有什么缺点吗?
最后,在部署 dockerized Django 应用程序时,是否有一种通用的最佳实践方法来处理 Django 的设置命令?还是我已经在做通常做的事情?
这是我的 Dockerfile:
FROM python:3.6
LABEL maintainer x@x.com
ARG requirements=requirements/production.txt
ENV DJANGO_SETTINGS_MODULE=site.settings.production_test
WORKDIR /app
COPY manage.py /app/
COPY requirements/ /app/requirements/
RUN pip install -r $requirements
COPY config config
COPY site site
COPY templates templates
COPY logs logs
COPY scripts scripts
EXPOSE 8001
CMD ["/usr/local/bin/gunicorn", "--config", "config/gunicorn.conf", "--log-config", "config/logging.conf", "-e", "DJANGO_SETTINGS_MODULE=site.settings.production_test", "-w", "4", "-b", "0.0.0.0:8001", "site.wsgi:application"]
还有我的 compose 文件(省略了 nginx 和 postgres 部分,因为它们对于说明问题没有必要):
version: "3.2"
services:
app:
restart: always
build:
context: .
dockerfile: Dockerfile.prodtest
args:
requirements: requirements/production.txt
#command: bash -c "python manage.py makemigrations && python manage.py migrate && gunicorn --config gunicorn.conf --log-config loggigng.conf -e DJANGO_SETTINGS_MODULE=site.settings.production_test -W 4 -b 0.0.0.0:8000 site.wsgi"
container_name: dj01
environment:
- DJANGO_SETTINGS_MODULE=site.settings.production_test
- PYTHONDONTWRITEBYTECODE=1
volumes:
- ./:/app
- /static:/static
- /media:/media
networks:
- main
depends_on:
- db
【问题讨论】:
标签: django docker docker-compose