Обновление без пересборки при наличии готового образа?

Привет, ребята.

Возможно ли обновиться до более новой версии без полной пересборки всего?

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

Полагаю, что для такого контейнера останется только позаботиться о миграции базы данных PostgreSQL?

Имеет ли это смысл и, если это возможно, как это сделать, в идеале без взлома исходного кода?

Большое спасибо, Л.

Вы можете собрать образ, загрузить его в репозиторий, а затем запустить с помощью команды ./launcher start-cmd app, чтобы получить команду Docker для запуска контейнера (но вам нужно будет подставить ваш репозиторий контейнера вместо локального).

Однако после этого вам потребуется выполнить миграцию базы данных, предварительно скомпилировать ресурсы и так далее.

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

Если вы хотите проявить особую осторожность, установите переменную SKIP_POST_DEPLOYMENT_MIGRATIONS в вашем файле app.yml, а затем выполните команду rake db:ensure_post_migrations db:migrate после запуска нового контейнера. Если этого не сделать, миграция базы данных может привести к тому, что старый контейнер больше не сможет её использовать. Это случается нечасто, и если и случается, то ненадолго.

Простой не является для меня проблемой.

Две приложения, которые я имею в виду, были бы — практически идентичными — но не одинаковыми.

Две приложения были бы разными сайтами, то есть имели бы разные базы данных, тома, порты, имена… но при этом использовали бы одну и ту же — так сказать — базовую версию Discourse (плюс одни и те же плагины и всё остальное, что критично для этого ядра/базы).

В идеальном мире Discourse — если такого ещё не существует — для такого сценария новый образ, собранный один раз, можно было бы использовать напрямую с помощью инструментов Docker. При этом база данных или любые компоненты, которые необходимо «мигрировать» на новый образ/версию Discourse, при запуске/загрузке такого «вторичного» контейнера — возможно, с помощью переменных окружения — определяли бы необходимость проверки и выполнения необходимых миграций баз данных.

Главное преимущество — о котором многие, вероятно, уже думали — заключается в использовании единого образа для обоих (или даже большего количества, если кто-то практикует такое) контейнеров/приложений.

Вы можете сделать это так, как я описал. Также в разработке находится новая схема, позволяющая использовать одно изображение без необходимости пересборки. Она не поддерживается официально, поэтому вам нужно будет хорошо поискать здесь или на GitHub.

Привет и спасибо.

Кажется, это работает: загрузка нового образа и запуск rake db:ensure_post_migrations db:migrate привели к созданию корректной и работоспособной новой версии контейнера без пересборки launcher — по крайней мере, при обновлении с версии 3.5.0.beta7 до 2025.11.0. Это заставляет меня (и, конечно, не только меня) задуматься… было бы возможно включить такую часть rake (и всё остальное, необходимое для корректного обновления) в процесс загрузки/запуска заданного пользовательского контейнера? И имело бы это смысл?

Скорее всего, вы также захотите предварительно скомпилировать ассеты