使用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路径
- 修改
build.gradle中的files为相对路径(去掉开头的斜杠):
docker { name 'my_open_jdk_image_palatir_build_image' files 'src/main/java/MyMainClass.java' // 去掉开头的/ dockerfile file('Dockerfile') }
- 修改Dockerfile中的COPY指令,直接复制临时上下文根目录下的文件:
COPY MyMainClass.java /src
内容的提问来源于stack exchange,提问作者Koh Yi Min Jason
相关产品推荐
相关产品推荐

