Подтвердить что ты не робот

Инструкция Dockerfile ONBUILD

Я прочитал в документации докера, как можно использовать инструкцию ONBUILD, но это не совсем понятно.
Может кто-нибудь объяснить это мне?

4b9b3361

Ответ 1

Инструкция ONBUILD очень полезна для автоматизации сборки выбранного вами программного стека.

пример

Контейнер Maven предназначен для компиляции Java-программ. Волшебным образом все, что нужно сделать Dockerfile вашему проекту, - это ссылаться на базовый контейнер, содержащий инструкции ONBUILD:

FROM maven:3.3-jdk-8-onbuild
CMD ["java","-jar","/usr/src/app/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar"]

Базовый образ Dockerfile рассказывает все

FROM maven:3-jdk-8

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ONBUILD ADD . /usr/src/app

ONBUILD RUN mvn install

Существует базовый образ, на котором установлены как Java, так и Maven, а также ряд инструкций для копирования файлов и запуска Maven.

Следующий ответ дает пример Java

Ответ 2

Как сказано в документации докера:

Инструкция ONBUILD добавляет к изображению команду триггера, которая должна быть выполнена позже, когда изображение используется в качестве основы для другой сборки. Триггер будет выполняться в контексте нисходящей сборки, как если бы он был вставлен сразу после инструкции FROM в нисходящем файле Docker.

Так что это значит? Давайте возьмем этот Nodejs Dockerfile:

FROM node:0.12.6

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ONBUILD COPY package.json /usr/src/app/
ONBUILD RUN npm install
ONBUILD COPY . /usr/src/app

CMD [ "npm", "start" ]

В вашем собственном Dockerfile, когда вы делаете FROM node:0.12.6-onbuild, вы получаете изображение, что означает, что команда build уже была выполнена, поэтому инструкции уже выполнены, но все, кроме тех, которые начинаются с ONBUILD. Они были перенесены на другое время, когда последующая сборка (когда ваш образ создается из вашего собственного файла Docker) использует этот образ в качестве базы (FROM node:0.12.6-onbuild).

Вы не можете просто вызвать ADD и RUN сейчас, потому что у вас еще нет доступа к исходному коду приложения, и оно будет отличаться для каждой сборки приложения.

Это так! Образ, содержащий инструкции по сборке, не был создан на вашем компьютере, поэтому он еще не имеет доступа к package.json.

Затем, когда вы создаете свой собственный Dockerfile, перед выполнением какой-либо инструкции в вашем файле сборщик будет искать триггеры ONBUILD, которые были добавлены в метаданные родительского изображения при его создании.

Это избавляет вас от хлопот, связанных с выполнением этих команд самостоятельно, на самом деле эти команды написаны в вашем собственном Dockerfile.

Наконец, они добавляют:

Вы можете просто предоставить разработчикам приложений стандартный Dockerfile для копирования и вставки в свое приложение, но это неэффективно, подвержено ошибкам и трудно обновляется, поскольку оно смешивается с кодом приложения.

Дело в том, что если эти инструкции изменены в стандартном Dockerfile, вам придется изменить их также и в своем Dockerfile. Но благодаря инструкции ONBUILD нам не нужно об этом беспокоиться.