簡體   English   中英

使用Palantir Gradle插件構建Docker容器時找不到.jar文件

[英].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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM