Теги Docker теряются между шагами в конвейерах Bitbucket - PullRequest
0 голосов
/ 29 ноября 2018

Я использую конвейеры Bitbucket для создания образов Docker с помощью Gradle.Вот моя сборка:

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 локально, я вижу своиtagged images:

$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
…

Вывод шага "build-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

Где потеряны теги ?

Обратите внимание, что некоторые идентификаторы изображений со второго шага (docker image ls)Похоже, что те же, что были напечатаны на первом шаге.

PS Я знаю, что если мне нужны теги (например, для публикации), я могу просто выполнить сборку и публикацию за один шаг.

1 Ответ

0 голосов
/ 29 ноября 2018

Хотя мне не удалось отследить основную причину, я сделал простой обходной путь, основанный на save и load командах Docker и Bitbucket Pipelines 'Артефакты .

Во-первых, я немного изменил схему тегирования:

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

Поэтому вместо метки времени UTC я полагаюсь на переменную окружения DOCKER_TAG, которую яможно установить внешне.

Затем определите шаг «build-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 для стандартного выходного потока.Содержит все родительские слои, и все теги + версии или указанный тег repo: для каждого предоставленного аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...