首页 文章

无法使用gradle-docker-plugin将jar添加到新的Docker镜像中

提问于
浏览
1

我几乎是Docker和Gradle的新手 . 我正在使用Docker,Gradle和Jenkins构建自己的CI流程 .

What I want:

在Jenkins上执行构建会执行包含gradle-docker插件(palantir)的Gradle构建脚本,然后构建相应的Docker镜像 .

What I've done:

我要构建的Docker镜像必须包含一个可执行的jar文件(Spring-boot),所以我添加了一个Docker构建步骤,ADD到我的Dockerfile,以添加由同一个Gradle构建过程的构建任务创建的jar文件到我的新Docker镜像 .

由Gradle创建的docker构建上下文目录是:

/var/lib/jenkins/workspace/build_test_docker/build/docker

上面的目录最初只有Dockerfile . 所以我通过Jenkins中的Execute shell步骤复制了我想要添加的jar,如下所示:

cp ${WORKSPACE}/build/libs/*jar ${WORKSPACE}/build/docker/

但我失败了因为 -

What I've encountered

我收到以下错误:

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

    正如@ 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任务通过'$指定” .

    以下是我在docker任务期间收到的错误消息 .

    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文件,并且成功完成构建过程 .

    我不知道还有更好的方法,但问题已经完成 .

相关问题