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

时间:2018-04-20 12:44:51

标签: java docker spring-boot gradle

如果我尝试在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文件?

5 个答案:

答案 0 :(得分:5)

它适用于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"]

答案 1 :(得分:4)

这似乎与palantir/gradle-docker issue 76一致,它指定:

  

我根据示例配置了一个新项目,我观察到整个项目(减去build/被复制到build/docker。我导致了一个不必要的大型docker构建上下文。

COPY应为build/docker/libs/myproject.jar,或build/本身不包括在内。

该问题提到了一种可能的解决方法,可以覆盖另一个泊坞窗步骤 - dockerPrepare - 明确准备“build/docker”文件夹。

  

除了Dockerfile之外,我只需要一个fatJar:

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

答案 2 :(得分:3)

问题是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

答案 3 :(得分:2)

你的gradle" destinationDir" ?

生成的jar将在destinationDir / archiveName中。也许是target / myproject.jar

所以你应该把:

COPY target/myproject.jar myproject.jar

如果它不起作用,请添加您的gradle:

destinationDir target

答案 4 :(得分:0)

我遇到了类似的问题。这是我花了很多时间后的working solution:-

build.gradle
String imageName = "${project.group}/${project.name}"
docker {
    //dependsOn build
    dockerfile file('Dockerfile')
    name imageName
    files bootJar.archiveFile.get()
    buildArgs(['JAR_FILE': "${bootJar.archiveFileName.get()}"])
}
dockerRun {
    name "${project.name}-container"
    image imageName
    ports '8081:8081'
    env 'SPRING_PROFILES_ACTIVE': 'dev'
    daemonize true
    clean false
}
詹金斯档案
FROM adoptopenjdk/openjdk11:alpine-jre

ARG APP_NAME="product-service"
ARG APP_VERSION="0.0.1"
ARG JAR_FILE="/build/libs/${APP_NAME}-${APP_VERSION}.jar"

COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar", "app.jar"]

这适用于 Gradle 任务 :docker:dockerRun。它也适用于 docker 命令行。