Я работаю над собственным импортером, чтобы перенести данные из нашего форума Woltlab в Discourse. Я сделал это, запустив Discourse напрямую на своей машине для разработки без Docker, и теперь у меня есть множество файлов в директории script/import_scripts/, содержащих мой код миграции. Эти файлы пока находятся в форке официального репозитория Discourse на GitHub.
Теперь я хочу перейти на официальную установку на основе Docker, но мне потребуется, чтобы мой код импортера был доступен в новой установке в течение некоторого времени, так как миграция должна выполняться поэтапно. Если возможно, я хотел бы хранить код импортера в отдельном репозитории и интегрировать его в продакшн-окружение аккуратным способом.
Мои знания в Rails ограничены, поэтому я могу упускать очевидный подход. Не могли бы вы подсказать правильное направление?
В данном случае я бы предложил один из следующих вариантов:
во время миграции с переключением используйте для вашего экземпляра ваш форк. Если вы хотите добавить новый функционал, просто регулярно синхронизируйте свой форк с upstream. После завершения миграции переключитесь обратно на discourse/discourse.
клонируйте ваш репозиторий вне Docker и скопируйте файлы внутрь. Делайте это после пересборки, иначе скрипт предварительной компиляции обнаружит, что репозиторий изменён, и сборка займёт гораздо больше времени.
Я изменил URL репозитория внутри Docker-контейнера и смог запустить свой импортер. Однако при запуске команды ./launcher rebuild app репозиторий был сброшен к upstream. Я изучил Dockerfile и увидел, что путь к репозиторию там жестко задан, но при этом базовый контейнер, похоже, собирается не локально, поэтому изменения в Dockerfile не дают желаемого эффекта. Есть ли какой-то одобренный способ заставить это работать?
Предлагаю работать с двумя контейнерами. Для этого создайте копию вашего текущего файла app.yml (он находится в /var/discourse/containers) и переименуйте её, например, в import.yml. Затем обновите параметр version на ветку вашего кастомного импортера.
params:
version: ваша-ветка
Всякий раз, когда нужно запустить импорт, остановите контейнер app, запустите контейнер import и выполните скрипт внутри контейнера import. Если в Discourse были внесены значительные изменения, возможно, потребуется перебаза вашей ветки на последний коммит из ядра и пересборка контейнера.
cd /var/discourse
./launcher enter import
# хотите переключиться на другую ветку?
su discourse -c 'git checkout <ветка>'
# хотите получить новый код?
su discourse -c 'git pull'
После завершения миграции остановите контейнер импорта и перезапустите контейнер приложения.
cd /var/discourse
./launcher stop import
./launcher start app
Благодарность @gerhard, который научил меня всему этому