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を見つけさせるにはどうすればよいですか?
問題は、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
これは、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
にコピーされていることがわかります。 。不要な大きなDockerビルドコンテキストが発生します。
COPY
はbuild/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'
}
あなたのgradle「destinationDir」は何ですか?
生成されたjarはdestinationDir/archiveNameにあります。おそらくtarget/myproject.jar
だからあなたは置くべきです:
COPY target/myproject.jar myproject.jar
それが機能しない場合は、gradleを追加してください:
destinationDir target