代码之家  ›  专栏  ›  技术社区  ›  madhead

Docker标记在Bitbucket管道中的步骤之间丢失

  •  2
  • madhead  · 技术社区  · 6 年前

    我正在使用 Bitbucket pipelines

    definitions:
      steps:
        - step: &build-docker
            name: Build Docker images
            image:
              name: openjdk:8
            services:
              - docker
            script:
              - ./gradlew dockerBuildImage
              - docker image ls
            caches:
              - gradle-wrapper
              - gradle
              - docker
        - step: &publish-docker
            name: Publish Docker images
            image:
              name: docker
            services:
              - docker
            script:
              - docker image ls
            caches:
              - docker
    pipelines:
      default:
        - step: *build-docker
        - step: *publish-docker
    

    我的 build.gradle.kts 配置为使用UTC时间戳标记图像:

    configure<DockerExtension> {
        configure(this.getProperty("javaApplication"), closureOf<DockerJavaApplication> {
            baseImage = "openjdk:8-jre-alpine"
            tag = "${name}:${Instant.now().epochSecond}"
        })
    }
    

    当我跑的时候 dockerBuildImage 本地任务,我可以看到我的标记图像:

    $docker image ls
    REPOSITORY     TAG          IMAGE ID       CREATED       SIZE
    …
    forklift-1     1540454741   93fd78260bd1   5 weeks ago   105MB
    forklift-2     1540454741   3c8e4e191fd3   5 weeks ago   105MB
    forklift-3     1540454741   1e80caffd59e   5 weeks ago   105MB
    forklift-4     1540454741   0e3d9c513144   5 weeks ago   105MB
    …
    

    “构建docker”步骤的输出如下所示:

    REPOSITORY                  TAG            IMAGE ID       CREATED          SIZE
    forklift-1                  1543511971     13146b26fe19   1 second ago     105MB
    forklift-2                  1543511971     7581987997aa   3 seconds ago    105MB
    forklift-3                  1543511971     a6ef74a8530e   6 seconds ago    105MB
    forklift-4                  1543511970     a7087154d731   10 seconds ago   105MB
    <none>                      <none>         cfc622dd7b3c   3 hours ago      105MB
    <none>                      <none>         f17e20778baf   3 hours ago      105MB
    <none>                      <none>         75cc06f4b5ee   3 hours ago      105MB
    <none>                      <none>         1762b4f89680   3 hours ago      105MB
    openjdk                     8-jre-alpine   2e01f547f003   5 weeks ago      83MB
    

    REPOSITORY   TAG      IMAGE ID       CREATED       SIZE
    <none>       <none>   cfc622dd7b3c   3 hours ago   105MB
    <none>       <none>   f17e20778baf   3 hours ago   105MB
    <none>       <none>   75cc06f4b5ee   3 hours ago   105MB
    <none>       <none>   1762b4f89680   3 hours ago   105MB
    

    标签丢在哪里了 ?

    请注意,第二步中的一些图像ID( docker image ls

    1 回复  |  直到 6 年前
        1
  •  1
  •   madhead    6 年前

    save load Bitbucket Pipelines' artifacts

    首先,我稍微更改了标记方案:

    configure<DockerExtension> {
        configure(this.getProperty("javaApplication"), closureOf<DockerJavaApplication> {
            baseImage = "openjdk:8-jre-alpine"
            tag = "${name}:${System.getenv("DOCKER_TAG")}"
        })
    }
    

    因此,我依赖于一个环境变量,而不是UTC时间戳 DOCKER_TAG

    然后,定义“构建docker”步骤如下:

    - step: &build-docker
        name: Build Docker images
        image:
          name: openjdk:8
        services:
          - docker
        script:
          - export DOCKER_TAG=${BITBUCKET_BUILD_NUMBER}
          - ./gradlew dockerBuildImage
          - docker save
            --output images.tar
            forklift-1:${DOCKER_TAG}
            forklift-2:${DOCKER_TAG}
            forklift-3:${DOCKER_TAG}
            forklift-3:${DOCKER_TAG}
        artifacts:
          - images.tar
        caches:
          - gradle-wrapper
          - gradle
    

    我可以使用构建编号作为标记,但是可以提供任何值。

    - step: &publish-docker
        name: Publish Docker images
        image:
          name: docker
        services:
          - docker
        script:
          - docker load --input images.tar
          - docker image ls
          - docker push …
    

    这是有效的,因为 docker save

    生成标准输出流的tarred存储库。包含所有父层, 和所有标签+版本

    推荐文章