如何在Azure DevOps Pipelines中使用当前的Dockerfile运行CI构建

73次阅读
没有评论

问题描述

在使用Azure DevOps Pipelines时,希望在CI流水线中使用与当前有效的Dockerfile指定的相同的docker镜像,而不是在每次提交时都构建镜像。用户想知道是否有现有的机制可以满足他的需求。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Docker中,你可以使用--cache-from标志来实现这个功能。这个标志告诉Docker使用已经构建的镜像作为缓存,以防止构建没有更改的镜像层。
以下是一个示例命令:

docker pull ${MY_IMAGE}:cache || true
docker build --cache-from ${MY_IMAGE}:cache -t ${MY_IMAGE}:${VERSION} -t ${MY_IMAGE}:cache .
docker push ${MY_IMAGE}:${VERSION}
docker push ${MY_IMAGE}:cache

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。

方案2

如果你的仓库通常没有大量并行工作,你可以为每个构建保留一个”cache”标签。这种方法很好,但如果你的仓库通常有很多并行工作,就不要创建一个缓存标签,而是使用最新版本。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

这基本上是你在问题中概述的过程,但我们依赖Docker来完成这项工作。首先,我们使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案3

如果你的仓库使用语义化版本控制,你可以将Dockerfile的哈希值放入$VERSION中,以确保每个提交都使用与该提交相关的构建环境。
以下是一个示例命令:

docker pull ${MY_IMAGE}:$VERSION || true
docker build --cache-from ${MY_IMAGE}:$VERSION -t ${MY_IMAGE}:$VERSION .
docker push ${MY_IMAGE}:$VERSION

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案4

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案5

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案6

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案7

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案8

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案9

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案10

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案11

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案12

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案13

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案14

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案15

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案16

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案17

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案18

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案19

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

方案20

如果你的仓库使用语义化版本控制,并且你不想在构建中使用版本标签,你可以使用latest标签。
以下是一个示例命令:

docker pull ${MY_IMAGE}:latest || true
docker build --cache-from ${MY_IMAGE}:latest -t ${MY_IMAGE}:${VERSION} .
docker push ${MY_IMAGE}:${VERSION}

在上面的示例中,我们首先使用docker pull命令将镜像层下载到本地。这比构建新镜像要快(通常情况下),如果你的CI/CD设置正确,这些镜像层应该已经存在于缓存中。
然后,--cache-from标志告诉Docker使用该镜像作为缓存。这将防止Docker构建没有更改的镜像层。
最后,我们使用docker push命令将新构建的镜像推送到镜像仓库。
请注意,无论你如何标记新镜像,甚至可以删除版本标签,都可以使用--cache-from标志。关键在于--cache-from标志确保Docker不会构建没有更改的镜像层。

正文完