Я хочу упаковать много локального и открытого исходного кода в контейнер Docker, который будет распространяться на хост-машины для сборки и запуска. Цель финального контейнера — выполняться в стиле командной строки и выводить результат, например ( docker run cmdcontainer args
). Проблема, с которой я столкнулся, заключается в том, что распространяемый исходный код должен быть нацелен и скомпилирован на определенном хосте, на котором он будет запущен один раз, и на это уходят часы. Однако после компиляции команда выполняется очень быстро.
Поэтому мне интересно, существует ли известный шаблон Docker для такого рода рабочего процесса:
Распространить Docker-контейнер с исходными файлами -> Запустить контейнер для создания нового контейнера со скомпилированными двоичными файлами -> Последующие запуски выполняют скомпилированный контейнер
Поскольку это по сути наложение нового контейнера поверх старого, кажется, что это возможно, но я новичок в Docker.
решение1
Поскольку каждый хост уникален, лучшее решение, которое я могу предложить, заключается в использовании тома для сохранения. Вам понадобится следующий рабочий процесс в вашей точке входа:
- Проверьте версию вашего скомпилированного кода в томе
- Если версия не совпадает, удалите содержимое тома.
- Если версия не установлена или не совпадает, запустите компиляцию
- Запишите новый номер версии в этот том.
- Запустите свое приложение из скомпилированной версии в томе
Это требует, чтобы ваш образ сборки включал номер версии, например хэш git. Вы можете сделать это с помощью аргумента сборки:
docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...
И тогда ваш Dockerfile будет включать что-то вроде:
ARG GIT_REV
ENV GIT_REV=${GIT_REV}
Обратите внимание, что любой пользователь, работающий без тома, все равно увидит, что каждый запуск выполняет компиляцию.