Я пытался найти лучший способ справиться с настройкой проекта Django с помощью Docker.Но я несколько озадачен тем, как CMD и ENTRYPOINT работают по отношению к командам compose.
Когда я впервые настраиваю проект, мне нужно запустить createuperuser и выполнить миграцию для базы данных.Я пытался использовать скрипт для запуска команд в качестве точки входа в моем Dockerfile, но, похоже, он не работал согласованно.Я переключился на конфигурацию, показанную ниже, где я перезаписываю CMD Dockerfile с помощью команд в моем файле compose, где сказано запускать makemigrations, migrate и createuperuser.
У меня проблема именно в том, как установитьэто так, что он делает то, что мне нужно.Если я задаю команду (показанную как закомментированную в коде) в моем файле компоновки, она должна перезаписать CMD в моем Dockerfile из того, что я понимаю.
Что я не уверен, так это то, нужно ли мне использовать ENTRYPOINT или CMD в моем Dockerfile для достижения этой цели?Поскольку CMD перезаписывается моим файлом compose, а ENTRYPOINT - нет, разве это не вызовет проблем, если он будет установлен в ENTRYPOINT, поскольку он попытается запустить gunicorn во второй раз после выполнения команды compose?
Будут ли какие-либо недостатки в этом подходе по сравнению с использованием сценария точки входа?
И наконец, существует ли общий передовой подход к обработке команд установки 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