Я прочитал в документации докера, как можно использовать инструкцию ONBUILD, но это не совсем понятно.
Может кто-нибудь объяснить это мне?
Инструкция Dockerfile ONBUILD
Ответ 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
нам не нужно об этом беспокоиться.