我对Docker和Gradle几乎不熟悉。我正在使用Docker,Gradle和Jenkins建立自己的CI流程。
我想要的是什么:
在Jenkins上执行构建会执行包含gradle-docker插件(palantir)的Gradle构建脚本,然后构建相应的Docker镜像。
我做了什么:
我要构建的Docker镜像必须包含一个可执行的jar文件(Spring-boot),所以我添加了一个Docker构建步骤,ADD到我的Dockerfile来添加我的构建任务创建的jar文件与我的新Docker镜像相同的Gradle构建过程。
Gradle创建的docker构建上下文目录是:
/var/lib/jenkins/workspace/build_test_docker/build/docker
上面的目录最初只有Dockerfile。所以我通过Jenkins中的Execute shell步骤复制了我想要添加的jar,如下所示:
cp ${WORKSPACE}/build/libs/*jar ${WORKSPACE}/build/docker/
但是因为 -
我失败了我遇到过什么:
我收到以下错误:
ADD failed: stat /var/lib/docker/tmp/docker-builder498743832/gs-spring-boot-docker.jar: no such file or directory
我发现上述错误的主要原因是gradle-docker插件意外删除了包含应该添加到新Docker镜像的jar文件的docker目录,并创建了一个只有Dockerfile的新docker目录
我应该为这个问题做些什么?我认为即使不使用执行shell复制步骤,也会有一个简单而有效的方法来解决问题。
答案 0 :(得分:0)
作为@nlloyd的评论,问题的关键是我的Dockerfile设置。
以下是Gradle脚本中关键问题的关键部分。
...
docker {
name "${project.group}/${jar.baseName}"
files jar.archivePath
buildArgs(['JAR_FILE': "${jar.archiveName}"])
}
bootJar {
baseName = 'gs-spring-boot-docker'
version = '0.1.0'
}
...
它创建jar文件,如下所示:
.../build/libs/gs-spring-boot-docker-0.1.0.jar
以下是Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
它需要一个参数,'JAR_FILE'应该是要包含在要构建的新Docker镜像中的jar文件的完整路径,并且JAR_FILE的特定值由Gradle脚本中的docker任务指定通过'$ {jar.archiveName}'。
以下是我在泊坞窗任务期间收到的错误消息。
ADD failed: stat /var/lib/docker/tmp/docker-builder498743832/gs-spring-boot-docker.jar: no such file or directory
它尝试添加'... / gs-spring-boot-docker.jar',但jar文件的实际名称是'gs-spring-boot-docker -0.1.0.jar',后跟版本签名。
所以我在Gradle脚本中删除了bootJar中的'version':
bootJar {
baseName = 'gs-spring-boot-docker'
}
然后它创建一个名为'gs-spring-boot-docker.jar'的jar文件,并成功完成构建过程。
我不知道有更好的方法可以做到这一点,但问题已经完成。