#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 выполнялась в чистой среде.