.файл jar не найден при создании контейнера Docker с подключаемым модулем Palantir Gradle

Если я попытаюсь создать контейнер Docker с приложением Spring Boot под Windows 10, я получу следующую ошибку:

> Task :docker FAILED
COPY failed: stat /var/lib/docker/tmp/docker-builder711841135/myproject.jar: no such file or directory

Я использую Docker Community Edition в версии 18.03.0-ce-win59 (16762) и Gradle 4.7 с Java 8.

построить.Gradle в (укороченный):

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.0.1.RELEASE'
    id "com.palantir.docker" version "0.19.2"
}

version = '2.0.0'
sourceCompatibility = 1.8
group = "com.example"

repositories {
    mavenCentral()
}

bootJar {
    archiveName 'myproject.jar'
}

dependencies {
    ...
}

docker {
    dependsOn(build)
    name "${project.group}/${jar.baseName}"
    files bootJar
}

Dockerfile (брат сборки.gradle в каталоге проекта верхнего уровня):

FROM openjdk:8-jre
COPY build/libs/myproject.jar myproject.jar

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/myproject.jar"]

Если я создам контейнер Docker с Docker только (без Gradle) он работает.

как я могу позволить Gradle (или Docker?) найти файл myproject.банку?

4 ответов


он работает со следующей конфигурацией docker задачи:

docker {
    dependsOn build
    name "${project.group}/${jar.baseName}"
    files bootJar.archivePath
    buildArgs(['JAR_FILE': "${bootJar.archiveName}"])
}

используя этот немного другой файл docker:

FROM openjdk:8-jre
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

это, кажется, согласуется с palantir / gradle-docker issue 76 на котором указаны:

Я настроил новый проект в соответствии с примерами, что я наблюдаю, это весь проект (за вычетом build/) копируется в build/docker. I вызывает ненужный большой контекст сборки docker.

или COPY должно быть build/docker/libs/myproject.jar или build/ сам по себе не включен вообще.

вопрос возможного обходной путь переопределение другого шага docker -dockerPrepare - подготовка ' однозначно.

мне нужен только один fatJar в дополнение к Dockerfile:

task dockerCopy(type: MoveTo, dependsOn: dockerPrepare) {
    from('build/packed') {
        include "${jarFullName}"
    }
    into 'build/docker'
}

проблема COPY команда в файле Docker:

COPY build/libs/myproject.jar myproject.jar

исходный каталог build/libs/ не там, где находятся файлы для создания контейнера Docker. Вместо этого каталог build/docker/ используется в качестве контекста сборки Docker. Когда COPY выполняется этот каталог является эффективным рабочим каталогом.

правильный COPY команда так же проста, как это:

COPY myproject.jar /

задач "Докер":

docker {
    dependsOn bootJar
    name "${project.group}/${jar.baseName}:${version}"
    files bootJar.archivePath
}

если вы хотите скопировать ресурсы тоже нужно добавить processResources до


Что такое ваш gradle "destinationDir"?

сгенерированный jar будет находиться в destinationDir / archiveName. Возможно, target / myproject.Джар

поэтому вы должны поставить:

COPY target/myproject.jar myproject.jar

если он не работает, добавьте в свой gradle:

destinationDir target