Шаблон Docker для контейнеров с длинной начальной командой

Шаблон Docker для контейнеров с длинной начальной командой

Я хочу упаковать много локального и открытого исходного кода в контейнер Docker, который будет распространяться на хост-машины для сборки и запуска. Цель финального контейнера — выполняться в стиле командной строки и выводить результат, например ( docker run cmdcontainer args). Проблема, с которой я столкнулся, заключается в том, что распространяемый исходный код должен быть нацелен и скомпилирован на определенном хосте, на котором он будет запущен один раз, и на это уходят часы. Однако после компиляции команда выполняется очень быстро.

Поэтому мне интересно, существует ли известный шаблон Docker для такого рода рабочего процесса:

Распространить Docker-контейнер с исходными файлами -> Запустить контейнер для создания нового контейнера со скомпилированными двоичными файлами -> Последующие запуски выполняют скомпилированный контейнер

Поскольку это по сути наложение нового контейнера поверх старого, кажется, что это возможно, но я новичок в Docker.

решение1

Поскольку каждый хост уникален, лучшее решение, которое я могу предложить, заключается в использовании тома для сохранения. Вам понадобится следующий рабочий процесс в вашей точке входа:

  1. Проверьте версию вашего скомпилированного кода в томе
  2. Если версия не совпадает, удалите содержимое тома.
  3. Если версия не установлена ​​или не совпадает, запустите компиляцию
  4. Запишите новый номер версии в этот том.
  5. Запустите свое приложение из скомпилированной версии в томе

Это требует, чтобы ваш образ сборки включал номер версии, например хэш git. Вы можете сделать это с помощью аргумента сборки:

docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...

И тогда ваш Dockerfile будет включать что-то вроде:

ARG GIT_REV
ENV GIT_REV=${GIT_REV}

Обратите внимание, что любой пользователь, работающий без тома, все равно увидит, что каждый запуск выполняет компиляцию.

Связанный контент