Должен ли я запускать команды 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, которые хотят записать обратно в исходное дерево, лучше запускать с хоста.

Вернуться на верх