You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gradle Palantir Docker插件构建镜像失败,docker build却正常

问题:用Palantir Docker插件执行./gradlew docker构建镜像失败,但docker build可正常运行

执行./gradlew docker时出现以下错误:

> Task :docker FAILED
COPY failed: file not found in build context or excluded by .dockerignore: stat src/main/java/MyMainClass.java: file does not exist

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':docker'.
> Process 'command 'docker'' finished with non-zero exit value 1

* Try:
> Run with --stracktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

BUILD FAILED in 548ms
3 actionable tasks: 3 executed

但在同一目录执行docker build -t <自定义镜像名> .时,镜像可以正常构建。


提供的代码文件

Dockerfile

FROM openjdk:22
WORKDIR /src
COPY /src/main/java/MyMainClass.java /src
RUN javac MyMainClass.java
CMD ["java", "MyMainClass"]

build.gradle

plugins {
    id 'java'
    id 'com.palantir.docker' version '0.35.0'
    id 'com.palantir.docker-run' version '0.35.0'
}

group 'docker.dockering.dockeringdocker'
version '1.0.1'

docker {
    name 'my_open_jdk_image_palatir_build_image'
    files '/src/main/java/MyMainClass.java'
    dockerfile file('Dockerfile')
}
dockerRun {
    name 'my_open_jdk_image_palatir_build_container'
    image 'my_open_jdk_image_palatir_build_image'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'MyMainClass'
        )
    }
}

问题原因

Palantir Docker插件默认会创建临时目录作为Docker构建上下文,仅将docker配置中files指定的文件复制到该临时目录。你配置的files '/src/main/java/MyMainClass.java'是绝对路径,插件会把这个文件放到临时上下文的根目录,但Dockerfile里的COPY /src/main/java/MyMainClass.java /src是从上下文的src/main/java/路径查找文件,自然找不到。而直接用docker build时,是将项目根目录作为构建上下文,所以能找到对应文件。


解决方案

有两种可行的解决方式:

方式一:让插件使用项目根目录作为构建上下文(推荐)

修改build.gradle中的docker配置,添加context = project.rootDir,这样插件的构建上下文就和docker build一致,无需修改Dockerfile:

docker {
    name 'my_open_jdk_image_palatir_build_image'
    context = project.rootDir // 添加这一行
    dockerfile file('Dockerfile')
}

此处可去掉files配置,因为上下文是项目根目录,所有文件都在上下文范围内,无需单独指定。

方式二:调整files配置和Dockerfile的COPY路径

  1. 修改build.gradle中的files为相对路径(去掉开头的斜杠):
docker {
    name 'my_open_jdk_image_palatir_build_image'
    files 'src/main/java/MyMainClass.java' // 去掉开头的/
    dockerfile file('Dockerfile')
}
  1. 修改Dockerfile中的COPY指令,直接复制临时上下文根目录下的文件:
COPY MyMainClass.java /src

内容的提问来源于stack exchange,提问作者Koh Yi Min Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 05:16:25