无法使用gradle-docker-plugin

时间:2018-04-18 15:56:58

标签: java docker jenkins gradle continuous-integration

我对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复制步骤,也会有一个简单而有效的方法来解决问题。

1 个答案:

答案 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文件,并成功完成构建过程。

我不知道有更好的方法可以做到这一点,但问题已经完成。