【问题标题】:Cannot add jars to new Docker image using gradle-docker-plugin无法使用 gradle-docker-plugin 将 jars 添加到新的 Docker 映像
【发布时间】:2018-09-28 22:55:43
【问题描述】:

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

我想要什么:

在 Jenkins 上执行构建会执行包含 gradle-docker 插件(palantir)的 Gradle 构建脚本,因此它会构建相应的 Docker 映像。

我做了什么:

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

Gradle创建的docker build context目录是:

/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 复制步骤,也会有一种简单而出色的方法来解决问题。

【问题讨论】:

  • 您是否将files 参数添加到Docker config
  • @nlloyd 啊!谢谢!这就是我所缺少的。你节省了我的时间。

标签: java docker jenkins gradle continuous-integration


【解决方案1】:

正如@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}”。

以下是我在执行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 中的“版本”:

bootJar {
    baseName = 'gs-spring-boot-docker'
}

然后它会创建一个具有正确名称的 jar 文件 'gs-spring-boot-docker.jar' 并且构建过程成功完成。

我还不知道有没有更好的方法来做到这一点,但问题已经解决了。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多