如果我尝试在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文件?
答案 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:-
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 命令行。