一段时间以来,我一直在修补 bitbucket 管道,并且在改进用于构建/部署脚本的时间和资源方面取得了很大进展。
但我陷入了这个问题:
- parallel:
- step:
caches:
- docker
services:
- docker
script:
- echo ${REGISTRY_PASSWORD} | docker login registry.our-domain.net --username bitbucket --password-stdin &&
- docker build --rm -t registry.our-domain.net/project-container_2:staging -f docker/web/Dockerfile . &&
- docker push registry.our-domain.net/project-container_2:staging
- step:
caches:
- docker
services:
- docker
script:
- echo ${REGISTRY_PASSWORD} | docker login registry.our-domain.net --username bitbucket --password-stdin &&
- docker build --rm -t registry.our-domain.net/project-container_1:staging -f docker/app/Dockerfile . &&
- docker push registry.our-domain.net/project-container_1:staging
如果我尝试缓存两个图像构建过程,我不能。只有首先编译的构建过程才会被缓存。Skipping assembly of docker cache as one is already present Cache "docker": Skipping upload for existing cache
似乎缓存是根据定义的缓存名称完成的。 docker-cache 是由 bitbucket 完成的,所以我不能“重命名”第二个。
有人有同样的问题/解决方案吗?
最佳答案
我在 BitBucket 管道中遇到了类似的 Docker 缓存问题。缓存构建并上传后,除非将其删除,否则不会更新。在并行构建期间,存在竞争条件,因此最快的一步获胜。
幸运的是,有一种方法可以以另一种方式管理缓存,但它需要更多的脚本。只需使用 Docker 的 save
和 load
命令并使用 caches
中定义的自定义缓存位置部分。多亏了这一点,每一步都会有自己的缓存。
为了清楚起见,我在两个地方嵌入了相同的脚本,但您可能希望使用一些 YAML anchor 并对其进行一些参数化,以使该解决方案更通用。
此外,如果缓存变得太大,您可能只保存 Docker 生成的一些图像,而不是保存所有图像( docker save imageName
而不是 docker save $(docker images -qa)
)
definitions:
caches:
custom-docker-cache-one: custom-docker-cache-one
custom-docker-cache-two: custom-docker-cache-two
steps:
- step-one:
services:
- docker
caches:
- custom-docker-cache-one
script: |-
if [ -f "custom-docker-cache-one/cache.tar" ]; then
docker load < custom-docker-cache-one/cache.tar;
fi
# Do some operations here
if [ ! -f "custom-docker-cache-one/cache.tar" ]; then
docker save $(docker images -qa) > custom-docker-cache-one/cache.tar;
fi
- step-two:
services:
- docker
caches:
- custom-docker-cache-two
script: |-
if [ -f "custom-docker-cache-two/cache.tar" ]; then
docker load < custom-docker-cache-two/cache.tar;
fi
# Do some operations here
if [ ! -f "custom-docker-cache-two/cache.tar" ]; then
docker save $(docker images -qa) > custom-docker-cache-two/cache.tar;
fi
关于docker - 用于两个并行 docker 构建的 Bitbucket docker 图像缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65627031/