web-dev-qa-db-ja.com

PalantirGradleプラグインを使用してDockerコンテナをビルドするときに.jarファイルが見つかりません

Windows10でSpringBootアプリケーションを使用してDockerコンテナーを構築しようとすると、次のエラーが発生します。

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

私はバージョン18.03.0のDockerCommunity Editionを使用しています-ce-win59(16762)およびGradle4.7とJava 8。

build.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(最上位のプロジェクトディレクトリにあるbuild.gradleの兄弟):

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

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

Dockerのみ(Gradleなし)でDockerコンテナーをビルドすると、機能します。

Gradle(またはDocker?)にファイルmyproject.jarを見つけさせるにはどうすればよいですか?

8
deamon

問題は、DockerファイルのCOPYコマンドです。

COPY build/libs/myproject.jar myproject.jar

ソースディレクトリbuild/libs/は、Dockerコンテナを構築するためのファイルが存在する場所ではありません。代わりにディレクトリbuild/docker/はDockerビルドコンテキストとして使用されます。 COPYが実行されると、このディレクトリが有効な作業ディレクトリになります。

正しいCOPYコマンドは次のように簡単です。

COPY myproject.jar /

Dockerタスク:

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

リソースもコピーする場合は、processResourcesパラメーターにfilesを追加する必要があります。

files bootJar.archivePath, processResources
8
deamon

これは、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"]
8
deamon

これは palantir/gradle-docker issue 76 と一致しているようです。

例に従って新しいプロジェクトを構成しましたが、プロジェクト全体(マイナスbuild/build/dockerにコピーされていることがわかります。 。不要な大きなDockerビルドコンテキストが発生します。

COPYbuild/docker/libs/myproject.jarであるか、build/自体はまったく含まれていません。

この問題は、別のDockerステップをオーバーライドする可能性のある回避策(dockerPrepare)に言及しました-'build/docker 'フォルダーを明示的に準備します。

Dockerfileに加えて必要なfatJarは1つだけです。

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

あなたのgradle「destinationDir」は何ですか?

生成されたjarはdestinationDir/archiveNameにあります。おそらくtarget/myproject.jar

だからあなたは置くべきです:

COPY target/myproject.jar myproject.jar

それが機能しない場合は、gradleを追加してください:

destinationDir target
2
Michaël L