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

标签 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 社区版和带有 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(没有 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
}

如果你也想复制资源,需要在files参数中添加processResources:

files bootJar.archivePath, processResources

关于java - 使用 Palantir Gradle 插件构建 Docker 容器时找不到 .jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49941955/

相关文章:

java - Windows 机器上的默认 Java

java - 如何在 strings.xml 文件中列出在 MainActivity.java 中创建的字符串

java - 如何将 JUnit TemporaryFolder @Rule 与 Spring @Value 属性一起使用?

spring-boot - Liquibase 正在尝试执行之前已经执行过的变更集,因此抛出该表已经存在的错误

java - 使用 Gradle 从 CLI 运行 Spring Boot 测试

java - 如何在 ImageView 中的可见图像周围创建边框

java - 尝试使用 Weka 将更多实例添加到训练集中时出现 IndexOutOfBoundsException

angular - 开发 Angular 应用程序时应该使用 Docker 吗?

docker - 如何为 Docker Compose 配置 dns 条目

php - 使用 Docker 运行 Laravel artisan 命令时连接被拒绝