[英].jar file not found when building a Docker container with Palantir Gradle plug-in
如果我嘗試在Windows 10下使用Spring Boot應用程序構建Docker容器,則會出現以下錯誤:
> Task :docker FAILED
COPY failed: stat /var/lib/docker/tmp/docker-builder711841135/myproject.jar: no such file or directory
我在版本18.03.0-ce-win59(16762)中使用Docker Community Edition,在Java 8中使用Gradle 4.7。
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構建Docker容器(沒有Gradle),它就能工作。
我怎樣才能讓Gradle(或Docker?)找到myproject.jar文件?
它適用於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"]
問題是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
這似乎與palantir / gradle-docker問題76一致, 該問題規定:
我根據示例配置了一個新項目,我觀察到整個項目(減去
build/
)被復制到build/docker
。 我導致不必要的大型docker構建上下文。
COPY
應該是build/docker/libs/myproject.jar
,或者根本不包含build/
本身。
該問題提到了一個可能的解決方法,重寫了另一個dockerPrepare
步驟 - dockerPrepare
- 明確地准備' build/docker
dockerPrepare
'文件夾。
除了Dockerfile,我只需要一個fatJar:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.