Что такое достойная практика для запуска django `makemigrations` вне среды разработки только для контейнеров - PullRequest
0 голосов
/ 26 декабря 2018

Я поднимаю контейнер с моим приложением на основе Django и другой контейнер с PostgreSQL, связанный друг с другом по сети, используя docker-compose.

Если я запускаю makemigrations вне сеанса bashвнутри моего док-контейнера приложения (связанного с контейнером PostgreSQL), например:

python manage.py makemigrations myapp

Я получаю следующее исключение:

django.db.utils.OperationalError: could not
 translate host name "db" to address: nodename 
nor servname provided, or not known

Что имеет смысл: у меня нет никакогоэкземпляр (и конфигурация) PostgreSQL вне контекста выполнения контейнера.

Из того, что я понимаю из прошлого опыта работы с другими языками, а также из других публикаций, таких как этот , было бы желательно для менязапустить makemigrations и зафиксировать это.

Какой будет лучший подход для создания и фиксации файлов миграции:

  • Должен ли я попытаться открыть контейнер PostgreSQL и изменить settings.py DATABASE, чтобы иметь возможностьзапустить команду makemigrations из локального сеанса bash?
  • Должен ли я скопировать результат makemigrations, выполненный изнутри контейнера, в мой репозиторий и затем зафиксировать его?
  • Не следует ли мне беспокоитьсяо том, чтобы не совершать миграции, а вместо этого делать их и запускать их с подходом docker-entrypoint.sh ( пример )?
  • Любой другой вариант?

1 Ответ

0 голосов
/ 26 декабря 2018

было бы желательно, чтобы я запустил makemigrations и зафиксировал его.

Вы правы, миграции всегда должны совершаться в репо.

Должен ли я попытаться открыть контейнер PostgreSQL и изменить файл settings.py DATABASE, чтобы иметь возможностьзапустить команду makemigrations из локальной сессии bash?

Я бы не стал делать это лично.

Вопрос о том, как приблизиться к бесшовной интеграции между локальным кодом и докером, - вопроскоторый имеет много ответов.Мне нравится монтировать мой код в контейнер как том, а затем, когда вы запустите makemigrations в контейнере, на вашем компьютере также появятся созданные миграции.

Что-то подобное в docker-compose.yml

  app:
    ...
    volumes:
      - path/to/local/src/:/src/
    working_dir: /src

где /src - папка с вашим manage.py.Теперь, когда вы выполните

docker exec -it container_name python manage.py makemigrations, он создаст файл миграции на вашем локальном компьютере, и у вас не возникнет проблем с копированием его туда и обратно.

Хотя остерегайтесь прав доступа к файлам, так какв этом случае миграции могут быть созданы с владельцем root в зависимости от вашей операционной системы.Но это для другого вопроса, я думаю.

...