by zhouzhipeng from blog.zhouzhipeng.com/dock и файл-…
Эта статья может быть воспроизведена полностью, но должны быть сохранены первоначальный автор и источник.
предисловие
自动化构建
Это незаменимое звено в процессе выпуска приложения.Обычно используемые инструменты построения включаютjenkins
,walle
Ждать. И эти инструменты обычно имеют следующие проблемы при сборке приложений:
- Нужно написать кучу команд оболочки для прямой или косвенной сборки, что непросто в управлении и имеет плохую совместимость
- Вышеупомянутый пункт может быть проще решить, но самый фатальный: сильная зависимость, такая как
jenkins
Программная среда на хосте или упаковщике, напримерgit
,maven
,java
Ждать
Идеальная ситуация такова: различные приложения, такие как java-приложения, приложения go, php-приложения и т. д., могут выполнять операции построения параллельно и без помех на хосте, отвечающем за построение, а программная среда и процесс построения, зависящие от построения, все может контролироваться разработчиком.
Пока что те, кто хорошо справляется с вышеперечисленными задачами, могут неdockerНи за что!
В мире докеров сборка обеспечивает镜像
, а зеркальное отображение может быть создано с помощьюDockerfile
(использовать вручнуюdocker commit
другое дело).
существуетdocker ce 17.05
После этого появилась очень важная функцияMulti-Stage Build
(многоступенчатая сборка), это значительно повысит вашу операционную продуктивность!
Далее будет использован реальный боевой случай для подробного объяснения.
Multi-Stage Build
эта особенность
Перед многоэтапной сборкой
Следующая демонстрация занимаетjava
Возьмем, к примеру, hello world, полный код находится в:GitHub.com/Чжоу Чжипэн…
Это стандартный проект maven только с основным классом HelloWorld. Общая идея конструкции такова:
- Скомпилируйте и упакуйте проект в образ maven
- Скопируйте банку, созданную на шаге 1.
- Используя банку, полученную на шаге 2, создайте и запустите основной класс в банке в образе jre.
Dockerfile.build используется для компиляции и упаковки jar
FROM maven:3.5.2-alpine
MAINTAINER zhouzhipeng <admin@zhouzhipeng.com>
WORKDIR /app
COPY . .
# 编译打包
RUN mvn package -Dmaven.test.skip=true
Dockerfile.old используется для запуска основного класса в банке.
FROM openjdk:8-jre-alpine
MAINTAINER zhouzhipeng <admin@zhouzhipeng.com>
WORKDIR /app
COPY docker-multi-stage-demo-1.0-SNAPSHOT.jar .
# 运行main类
CMD java -cp docker-multi-stage-demo-1.0-SNAPSHOT.jar com.zhouzhipeng.HelloWorld
Обратите внимание, что файл docker-multi-stage-demo-1.0-SNAPSHOT.jar, связанный между двумя файлами dockerfile, требует, чтобы другой скрипт build.sh был связан вместе.
build.sh
#!/usr/bin/env bash
# 1. 先构建出带有产物jar的镜像
docker build -t zhouzhipeng/dockermultistagedemo-build -f Dockerfile.build .
# 2. 临时创建 dockermultistagedemo-build 容器
docker create --name build zhouzhipeng/dockermultistagedemo-build
# 3. 将上面容器中的jar拷贝出来
docker cp build:/app/target/docker-multi-stage-demo-1.0-SNAPSHOT.jar ./
# 4. 构建java执行的镜像
docker build -t zhouzhipeng/dockermultistagedemo -f Dockerfile.old .
# 5. 删除临时jar文件
rm -rf docker-multi-stage-demo-1.0-SNAPSHOT.jar
Друзья, которые также знают о Dockerfile и оболочке, считают, что все они должны понимать, поэтому я не буду здесь вдаваться в подробности.
После сборки с несколькими состояниями
После просмотра последнего раздела вы можете почувствовать себя немного хлопотно? Да, проблема заключается не только в том, что нужно написать несколько dockerfile, но и в том, что скрипт build.sh будет выполняться дополнительно. Несомненно, это увеличивает сложность создания приложений!
Объединив вышеупомянутые файлы Dockerfile.build и Dockerfile.old с небольшой модификацией, мы получим следующий совершенно новый файл Dockerfile:
FROM maven:3.5.2-alpine as builder
MAINTAINER zhouzhipeng <admin@zhouzhipeng.com>
WORKDIR /app
COPY src .
COPY pom.xml .
# 编译打包 (jar包生成路径:/app/target)
RUN mvn package -Dmaven.test.skip=true
FROM openjdk:8-jre-alpine
MAINTAINER zhouzhipeng <admin@zhouzhipeng.com>
WORKDIR /app
COPY --from=builder /app/target/docker-multi-stage-demo-1.0-SNAPSHOT.jar .
# 运行main类
CMD java -cp docker-multi-stage-demo-1.0-SNAPSHOT.jar com.zhouzhipeng.HelloWorld
Затем все еще знакомая команда сборки докера
docker build -t zhouzhipeng/dockermultistagedemo-new .
Вот и все.
Если вы будете внимательны, вам не составит труда обнаружить, что в приведенном выше файле Docker есть два отличия.
- появилось несколько
FROM
утверждение -
COPY
больше после команды--from=builder
Это главный кофе на сегодняMulti-Stage Build
, Давайте сначала интуитивно почувствуем, что называется, через картинкуMulti-Stage Build
(Многоэтапная сборка):
С помощью многоэтапных сборок вы можете сделать файл Dockerfile кратким и легко читаемым, сохраняя при этом «чистый» образ конечного продукта.
просто понять
Или возьмите Dockerfile выше в качестве примера, как показано на следующем рисунке:
Части в красной рамке можно рассматривать как независимые «этапы», и можно примерно представить, что достижение является независимым содержимым Dockerfile.
Все мы знаем, что построение образа происходит слой за слоем, согласно порядку командной строки Dockerfile, укладка выполняется сверху вниз. Следовательно, нижняя ступень может относиться к верхней ступени.Чтобы облегчить ссылку на верхнюю ступень, необходимо дать ей имя и использоватьas
оператор.
FROM
Полный формат команды выглядит следующим образом:
FROM <image>[:<tag>] [AS <name>]
Взаимодействие между этапами является файлом, поэтомуCOPY
Команду необходимо расширить через--from=<name>
Чтобы указать, на каком «этапе» копировать файлы сверху, полный формат команды выглядит следующим образом:
COPY --from=<name|index> <src>... <dest>
# 注意--from 是可选的,当上层的stage没有名字时可以按照index(从0开始)的顺序引用,eg. --from=0
Стоит отметить, что по умолчаниюdocker build
Когда команда создает файл dockerfile, содержащий несколько этапов, конечным продуктом является образ, созданный на самом низком этапе.
Конечно, если по причинам отладки или другим потребностям, docker также поддерживает сборку до указанной стадии, используйте--target builder
Вы можете просто создать образ строителя.
docker build -t zhouzhipeng/builder --target builder .
последний шаг
На данный момент у нас есть Dockerfile, который можно собрать одним щелчком мыши, и нам просто нужно сделать так, чтобы он собирался автоматически!
вы можете использовать то, с чем вы знакомыjenkins
В сочетании с веб-перехватчиком github для отправки кода выполните команду сборки докера.
Конечно, я рекомендую использовать официальный докер-хаб для личного опыта, потому что тогда созданными вами образами можно будет поделиться с другими.
Конкретная функция автоматической сборки Docker Hub не будет подробно объясняться, ниже приведена краткая демонстрация с изображением в формате gif, и заинтересованные друзья могут изучить ее самостоятельно.
Суммировать
Multi-Stage Build
Эта функция очень удобна для построения конвейерных потоков и наиболее подходит для приложений со сложными зависимыми средами и сложными процессами.
Вы можете клонировать приведенный выше исходный код и попробовать его:GitHub.com/Чжоу Чжипэн…