问题描述
在使用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不会构建没有更改的镜像层。