Почему сбой GitLab CI / CD с многоступенчатым Dockerfile?

#docker #gitlab #dockerfile #gitlab-ci

#docker #gitlab #dockerfile #gitlab-ci

Вопрос:

После этого весеннего сообщения в блоге у меня есть многоступенчатый Dockerfile:

 FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=./hello/build/libs/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
ADD ./dependencies/ ./


FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/snapshot-dependencies/ ./
# COPY --from=builder application/resources/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
  

Он отлично работает в локальной среде с: docker build . --tag hello .

Я хочу запустить конвейер GitLab CI / CD, который создает этот Dockerfile, поэтому мой .gitlab-ci.yml :

 image: openjdk:11

variables:
  DOCKER_DRIVER: overlay
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"

stages:
  - build
  - release

build hello:
  stage: build
  script:
    - cd ./hello
    - ./gradlew build -x test --stacktrace
  artifacts:
    paths:
      - ./hello/build/libs/*.jar
  only:
    changes:
      - hello/**/*

release hello:
  image: docker:latest
  services:
    - docker:dind
  stage: release
  script:
    - docker build -t registry.gitlab.com/myproject/hello --file ./Dockerfile .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push registry.gitlab.com/myproject/hello
  only:
    changes:
      - hello/**/*
  

но… сбой происходит потому, что между двумя этапами Dockerfile не могут быть найдены извлеченные (из builder) папки.

Как я могу решить эту проблему и реализовать работающий GitLab CI / CD, который создает образ из этого Dockerfile?


Редактировать:

Если я добавлю RUN ls application команду после каждой COPY команды на втором этапе:

 FROM adoptopenjdk:11-jre-hotspot AS builder
WORKDIR application
ARG JAR_FILE=./hello/build/libs/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract


FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies ./
RUN ls application
COPY --from=builder application/snapshot-dependencies ./
RUN ls application
# COPY --from=builder application/resources ./
COPY --from=builder application/spring-boot-loader ./
RUN ls application
COPY --from=builder application/application ./
RUN ls application
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
  

GitLab CI / CD работает правильно. Разве это не странно?

Комментарии:

1. на первый взгляд это может быть просто проблема с абсолютным / относительным путем. Может быть, попробуйте заменить WORKDIR application на WORKDIR /app и COPY --from=builder application/dependencies/ ./ на COPY --from=builder /app/dependencies/ ./ (так, с косой чертой)?

2. Это все равно не работает. Проблема, по-видимому, заключается в том, что между первой фазой Dockerfile и второй (на стадии release GitLab CI / CD) нет извлеченных папок. Как если бы вторая фаза Dockerfile выполнялась в чистой среде.