Поиск по сайту:

Как использовать 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, который конечным пользователям необходимо будет настроить до того, как окончательная среда контейнера будет считаться завершенной.