docker - 用于两个并行 docker 构建的 Bitbucket docker 图像缓存

标签 docker caching bitbucket

一段时间以来,我一直在修补 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 的 saveload命令并使用 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/

相关文章:

Docker 镜像层树

git - 无法 git 推送到 Bitbucket : Unauthorized - fatal: Could not read from remote repository

linux - 如何在 kubernetes 中部署 nginx.config 文件

linux - 共享卷/文件权限/所有权(Docker)

macos - Docker错误正在运行镜像hyperkube-amd64:v1.7.0

php - 配置 Varnish 后如何将网页缓存 2 分钟。 (Ubuntu 14.04,Apache,PHP)

docker - 从 Jenkinsfile 启动时,Gradle docker 容器忽略缓存

c++ - std::vector 中的每个元素访问都是缓存未命中吗?

google-app-engine - 收到 403 错误,但正在部署版本,流量为 0%

linux - golang.org/x/sys/unix 缺少函数体的问题