Как использовать Dockerfile ONBUILD для запуска триггеров в последующих сборках
Инструкция Docker ONBUILD
позволяет настроить триггеры внутри образа. Ваши триггеры будут выполнены позже, когда изображение будет использовано в качестве основы для другого. Они станут частью нового нижестоящего контекста образа и не будут слоями файловой системы в вашей первоначальной сборке docker
.
Добавление триггеров ONBUILD
ONBUILD
— это инструкция, которую вы записываете в свои файлы Dockerfile. Он уникален тем, что принимает в качестве аргумента другую инструкцию. Вы можете указать любую операцию Dockerfile, например COPY
или RUN
, и выполнить ее во время последующей сборки образа.
ONBUILD RUN example-command
В этом примере выполняется example-command
в дочернем образе во время его сборки. Вот еще один случай, когда файл копируется из контекста сборки нижестоящего образа в файловую систему:
ONBUILD COPY assets.json /app/assets.json
Инструкции ONBUILD
никак не влияют на образ, создаваемый файлом Dockerfile, в котором они определены. Сборка указанного выше файла Dockerfile не запускает example-command
или включите assets.json
в изображение:
# Does not include the extra instructions docker build -t base-image:latest .
Триггеры будут использоваться при написании другого Dockerfile, который использует первый в качестве основы:
FROM base-image:latest RUN my-binary
docker build -t downstream-image:latest .
Создание этого Dockerfile запустит example-command
, скопирует в assets.json
и, наконец, запустит my-binary
. Триггеры ONBUILD
всегда выполняются первыми, сразу после инструкции FROM
в нисходящем Dockerfile.
Как Docker распознает триггеры?
ONBUILD
не влияет на файловую систему базового контейнера, но Docker по-прежнему знает о наличии триггеров при создании подчиненного образа. Процесс сборки отслеживает найденные инструкции ONBUILD
и записывает их в метаданные образа.
Docker проверяет метаданные изображений, на которые ссылается инструкция FROM
. Если именованный образ включает в себя триггеры в своих метаданных, эти инструкции по триггерам фактически вставляются в начало нижестоящего файла Dockerfile перед началом сборки.
Триггеры на самом деле выполняются как часть этапа сборки FROM
. Они будут запускаться в том порядке, в котором они были записаны в вышестоящем Dockerfile. Если инструкция ONBUILD
завершится ошибкой, Docker отменит сборку, и это будет выглядеть так, как будто причиной был этап FROM
.
Ограничения
Вы можете использовать любую инструкцию Dockerfile в качестве аргумента триггера ONBUILD
за тремя исключениями:
ONBUILD FROM
— это не разрешено, так как это переопределит базовый образ, используемый для сборки. Каждый файл Dockerfile должен наследовать от одной базы.ONBUILD MAINTAINER
— инструкцияMAINTAINER
устарела и не должна использоваться; информацию об авторстве лучше всего предоставлять в виде ярлыка. ИнструкцияLABEL
совместима сONBUILD
.ONBUILD ONBUILD
— объединение инструкцийONBUILD
не поддерживается. Все триггеры выполняются в образе сразу после вашего Dockerfile. Вы не можете определить триггеры, предназначенные для выполнения в «внучатых» образах на два или более уровней ниже определяющего Dockerfile.
Все инструкции определяются так же, как и их обычное использование. Написание обычного шага в вашем файле Docker, а затем добавление к нему префикса ONBUILD
, выведет его из обычного потока сборки и вместо этого сделает его нижестоящим триггером сборки.
Когда полезны триггеры ONBUILD?
ONBUILD
чаще всего используется в служебных образах, которые автоматизируют такие задачи, как компиляция кода. Процедура такого рода обычно требует выполнения нескольких шагов в определенной последовательности с добавлением зависимостей, таких как ваш исходный код, в определенный момент.
Рассмотрим образ компиляции, который ищет исходный код в каталоге, а затем выполняет команду для его сборки. Вы не можете просто COPY
и RUN
в Dockerfile этого образа, поскольку исходный код конечного пользователя не будет существовать внутри вашего контекста сборки образа.
Использование ONBUILD
позволяет вам предоставить стандартный файл Dockerfile, который ваши пользователи могут расширять и собирать docker
, не изобретая заново общие функции:
ENV BUILD_ENV=production RUN init-build.sh ONBUILD COPY /src /build ONBUILD RUN compile.sh --destination=/bin
В этом примере показано, как образ построителя может предоставить предварительно настроенную среду компиляции. При использовании в качестве базового образа код будет автоматически компилироваться из нижестоящего контекста сборки. Этот образ может взаимодействовать с скомпилированным выводом в /bin
на своих собственных этапах Dockerfile.
Краткое содержание
Инструкции ONBUILD
в файлах Dockerfile позволяют выполнять триггеры как часть последующей сборки. Вы можете использовать любую другую инструкцию Dockerfile в качестве триггера ONBUILD
, за исключением нескольких ограничений.
Использование ONBUILD
позволяет создавать универсальные образы Docker, определяющие многократно используемые наборы функций. Это более эффективно, чем заставлять пользователей копировать текст примера Dockerfiles дословно, а затем добавлять свои собственные инструкции внизу. Вы по-прежнему можете изменять и обновлять базовый образ, не требуя действий от пользователей.
Принятие ONBUILD
сокращает количество повторений и облегчает создание расширяемых базовых образов Docker. Инструкции ONBUILD
заслуживают внимания при создании стандартного файла Dockerfile, который конечным пользователям необходимо будет настроить до того, как окончательная среда контейнера будет считаться завершенной.