Azure DevOps (八) 通过流水线编译Docker镜像

上一篇文章我们完成了最简单的传统部署:上传应用到服务器上使用守护进程进行应用的部署。

本篇文章我们开始研究容器化和流水线的协作。

在开始操作之前,我们首先需要准备一下我们的dockerfile,这里我们依然还是使用前几篇文章使用的项目,贴一下文件内容。

既然我们是使用的微软的azure,所以我也就直接用了azure维护的jdk:zulu,我自己电脑上的jdk也是用的这个,因为我是M1芯片的mac,最一开始的时候官方并没有ARM架构的JDK

但是微软第一时间发行了zulu的ARM版本,我就一直用到了现在。

FROM  azul/zulu-openjdk-debian:8
COPY demo-app.jar /demo-app.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN
ENTRYPOINT exec java -jar demo-app.jar

接下来我们来创建一条新的release 流水线,这里有个深坑,就是我们在选择agent的时候一定要选对了,选linux的发行版,我最一开始没注意这个问题

导致后执行docker build 的时候一直提示我平台不对,结果我一看执行的是docker.exe o(╥﹏╥)o

首选创建agent,上面选择azure pipelines,下面选择ubantu

 

接下来创建两个Task,第一个task用来整理一下文件目录,第二个task用来执行容器的编译。

首先创建第一个task,我们需要把dockerfile和我们的应用放在同一目录下。

我们在agent下创建一个bash任务,选择在线脚本。

 

 

 

这里我贴一下脚本的内容,主要就是从流水线编译好的制品中,提取出Dockerfile和我们的应用程序放在统一目录下。 

cd _my-devops
mkdir finaldir
pwd
ls
cd webhook
ls
mv demo-app.jar  ../finaldir
mv classes/Dockerfile ../finaldir
cd ../finaldir
ls
pwd

 

接下来我们创建第二个task,用来执行docker build

我们在agent下添加一个docker执行步骤,在右侧搜索docker,进行添加 

 

添加完成之后,这里有两部分需要我们填,Container Repository我们暂时先留空,因为我手头没有合适的仓库,我们本篇文章的重点放在镜像的编译工作上,

我们在commands配置项里输入dockerfile的路径,和命令的执行路径,这里我把路径填写为了上面我整理好的finaldir中去,如果你有需要指定的编译参数可以

写到Arguments中去,这里还有一个tag,用来指定我们镜像的版本,$(Build.BuildId)环境变量会获取我们本次流水线的编译号,例如我这用的是test-$(Build.BuildId)

那么到时候就会生成类似:test-3的一个tag打在镜像上,让我们区分镜像结果。

 

 

按照要求填完之后,我们启动一下这个流水线看一下执行的效果。

从bash的执行结果中,我们可以看到,我们已经成功的整理好了文件目录,把应用程序和dockerfile放在了同一个文件夹下。

 

 我们再来看一下dockerbuild的结果,azure成功的编译出了我们的镜像

 

 

 

 

 到这里我们就成功的使用azure的流水线编译出了第一个docker的镜像,说实话踩了很多坑,尤其是一开始没有选择对agent的类型,卡了半天没意识到这个问题,我一直以为是我dockerfile中FROM的基础镜像有问题,还去翻了半天源码,看着源码里那个debain发行版本怀疑了半天人生,最后才意识到可能是agent的问题o(╥﹏╥)o

下一篇我们会研究如何通过azure打通一个公网的docker仓库,把我们编译好的镜像推送到仓库去。

posted @ 2022-03-31 16:43  Tassdar  阅读(597)  评论(0编辑  收藏  举报