Команда COPY или ADD в Dockerfile не может найти файл JAR для приложения Springboot - PullRequest
0 голосов
/ 07 марта 2020

Я получаю эту ошибку, когда пытаюсь скопировать сгенерированный файл JAR из целевой папки в папку / usr / share / в образе Docker. Я просмотрел Docker форумов, и у людей точно такая же проблема, но нет четкого ответа, который решает эту проблему.

Step 9/10 : COPY target/${JAR_FILE} /usr/share/${JAR_FILE}
ERROR: Service 'myservice' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder558103764/target/myservice.jar: no such file or directory

Вот мой Dockerfile: ---------- ------------- begin ---------

FROM adoptopenjdk/openjdk11:alpine
MAINTAINER XXX XXX <ramil.xxxxx@xxxx.ai>

# Add the service itself
ARG JAR_FILE="myservice-1.0.0.jar"
RUN apk add maven
WORKDIR /app
COPY . /app/
RUN mvn -f /app/pom.xml clean install -DskipTests
WORKDIR /app
COPY target/${JAR_FILE} /usr/share/${JAR_FILE}

ENTRYPOINT ["java", "-jar", "/usr/share/myservice-1.0.0.jar"]
------ end snip -------

Вот как я запускаю это из базовой папки, где у меня есть Dockerfile на моей Ma c.

docker build -t service-image .

Ответы [ 3 ]

1 голос
/ 07 марта 2020

Итак, я думаю, вы пытаетесь переместить ваш sr c в образ и запустить сборку mvn и скопировать созданный файл из целевой папки в общую папку.

Если это так, кажется, что все в порядке, кроме этой строки

COPY target/${JAR_FILE} /usr/share/${JAR_FILE}

COPY принимает sr c и пункт назначения. Он позволяет вам копировать только локальный файл или каталог с вашего хоста (машина, создающая образ Docker) в само изображение Docker

Я думаю, что вы намереваетесь скопировать файл внутри вашего папка контейнера от /target до /usr/share. попробуйте это

RUN cp target/${JAR_FILE} /usr/share/${JAR_FILE}

Ошибка перепрограммирования, которую вы видите, потому что с помощью COPY команда Docker попытается получить файл из docker пути по умолчанию в вашем HOST

т.е. /var/lib/docker/tmp/docker-builder558103764/

, где /target папка не существует

0 голосов
/ 03 апреля 2020

Оказывается, что Dockerfile, который я использовал, хотел быть выполненным в папке, отличной от того, где находился Dockerfile.

Итак, учитывая build_config_folder/Dockerfile ...

Таким образом, вместо

docker build --build-arg SOME_ARG=value build_config_folder

# or 

cd build_config_folder
docker build --build-arg SOME_ARG=value .

Это должно было быть

docker build --build-arg SOME_ARG=value -f build_config_folder/Dockerfile .

Это потому, что последний позиционный аргумент пути определяет, где команда COPY будет искать файлы и папки.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 09 марта 2020

То, что также работало после просмотра форумов Docker, использует многоэтапную сборку . Многоступенчатая сборка не только заставляет вас использовать папки, в которых вы указываете WORKDIR на этапе сборки, но также значительно уменьшает размер базовых образов до 5x-6x меньше, чем при использовании одностадийной сборки, как я показал выше. , Ниже приведено мое решение найти этот jar-файл в папке, которую я указал как WORKDIR, и использовать этот jar-файл для моего меньшего базового образа. Одноэтапная сборка в моем исходном решении создает 560 МБ изображений. Этот многоступенчатый Dockerfile ниже создает образ, который имеет размер 108 МБ .

FROM adoptopenjdk/openjdk11:alpine as compile
MAINTAINER XXXX <ramil.xxxx@xxxx.ai>

# Build the jar using maven 
RUN apk add maven
WORKDIR /app
COPY . /app/
RUN mvn -f pom.xml clean package -DskipTests

FROM adoptopenjdk/openjdk11:alpine-jre
# Copy the packaged jar app file to a smaller JRE base image
COPY --from=compile "/app/target/service-1.0.0.jar" /usr/share/

ENTRYPOINT ["java", "-jar", "/usr/share/service-1.0.0.jar"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...