Выполнять команду на хосте во время сборки докеров

Возможно ли создать Dockerfile который выполняет команду на хосте при создании образа?

Теперь я делаю:

./script_that_creates_magic_file.sh
docker build .

с Dockerfile:

FROM alpine
COPY magic_file

Я хочу иметь возможность:

docker build .

с Dockerfile:

FROM alpine
# invoke script_that_creates_magic_file.sh on the host
COPY magic_file

Конечно, этот скрипт находится в том же каталоге, что и Dockerfile.

Ответы

Ответ 1

(Просто предложение)

У нас обычно есть следующая структура для построения наших изображений докеров:

my-image/
├── assets
│   ├── entrypoint.sh
│   └── install.sh
├── build.sh
├── Dockerfile
├── README.md
└── VERSION
  • build.sh: Это вы должны были вызвать script_that_creates_magic_file.sh. Другие распространенные задачи включают загрузку необходимых файлов или временное копирование ключей ssh с хоста. Наконец, этот скрипт вызовет docker build.
  • Dockerfile: Как обычно, но в зависимости от количества команд, которые нам нужно запустить, у нас может быть install.sh
  • install.sh: Это копируется и запускается внутри контейнера, устанавливает пакеты, удаляет ненужные файлы и т.д. Не будучи уверенным на 100% - я думаю, что такой подход уменьшает количество слоев, избегая нескольких команд за один RUN
  • entrypoint.sh: Точка входа в контейнер. Позволяет нам выполнять задачи при запуске контейнера (например, переменные среды разбора) и распечатать информацию об отладке

Я считаю, что эта структура удобна и самодокументирована, так как каждый в команде может создавать любое изображение (никаких специальных инструкций/шагов). README там, чтобы объяснить, что делает изображение... но я не буду врать вам... он обычно пуст... (или имеет h1 для отображения gitlab) :)

Ответ 2

Чтобы ответить на вопрос; нет нет встроенных функций для запуска команды на хосте перед docker build (т.е. нет "крючков" для запуска скриптов на хосте).

Если вы предоставите более подробную информацию о своем прецеденте, возможно, есть альтернативы (например, использование комбинации --build-arg и docker compose)