如果我尝试在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)和Java的Gradle 4.7的Docker Community Edition。
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?
问题是COPYDocker文件中的命令:
COPY
COPY build/libs/myproject.jar myproject.jar
源目录build/libs/不是用于构建Docker容器的文件所在的位置。而是将该目录build/docker/用作Docker构建上下文。当COPY执行时,该目录是有效的工作目录。
build/libs/
build/docker/
正确的COPY命令是如此简单:
COPY myproject.jar /
Docker任务:
docker { dependsOn bootJar name "${project.group}/${jar.baseName}:${version}" files bootJar.archivePath }
如果也要复制资源,则需要添加processResources到files参数:
processResources
files
files bootJar.archivePath, processResources