Должен ли я запускать команды django вне контейнера docker или в cli контейнера docker
Я только начал докеризацию своих приложений Django, пока все идет хорошо, но мне нужно знать, является ли лучшей практикой выполнение команд Django внутри контейнера
docker container exec -it con_name python manage.py startup app_name
или я должен просто запустить его вне контейнера
python manage.py startup app_name
спасибо
В моем случае я запускаю команды администратора, такие как "startapp", локально во время разработки, затем я запускаю makemigrations и migrate внутри контейнера на этапе развертывания и, наконец, я запускаю периодические задачи во втором контейнере (тот же образ), управляемом celery.
Насколько это возможно, я бы избегал использования docker exec
. Это очень полезный инструмент для отладки, но он не должен быть обычным способом взаимодействия с контейнерами.
Вы говорите именно о запуске приложения. Здесь вполне можно использовать обычную виртуальную среду Python, игнорируя Docker, даже если вы собираетесь в конечном итоге развертывать приложение через контейнер; среда разработки хоста в паре с контейнерной базой данных также может быть хорошей комбинацией.
В противном случае запуск сервера должен быть Dockerfile CMD. Сервер будет единственным процессом, запущенным контейнером, и если сервер выйдет, то выйдет и контейнер.
# requires manage.py to be executable and begin with the line
# #!/usr/bin/env python3
CMD ["./manage.py", "runserver", "--host", "0.0.0.0"]
Существуют различные команды поддержки, которые может выполнять сценарий manage.py
, например, запуск миграции базы данных. Существует несколько подходов к этому. Один простой - запустить новый контейнер с теми же сетевыми настройками и конфигурацией базы данных, но с альтернативной командой. Если вы используете Compose для запуска основного сервера, есть команда docker-compose run
, которая делает именно это:
docker-compose run myapp \
./manage.py migrate
(Есть вопрос по поводу стиля использования CMD
против ENTRYPOINT
в Dockerfile. Команда, которую я показываю здесь, заменяет CMD
; синтаксис для замены ENTRYPOINT
гораздо более неудобен. Это одна из нескольких причин, почему я предпочитаю CMD
, если есть выбор.)
Для этих команд поддержки также можно запускать их с хоста, но такие вещи, как конфигурация базы данных, будут отличаться. Особенно такие команды, как ./manage.py makemigrations
, которые хотят записать обратно в исходное дерево, лучше запускать с хоста.