【问题标题】:Dockerfile to create image of spring bootDockerfile 来创建 Spring Boot 的镜像
【发布时间】:2019-11-18 06:16:10
【问题描述】:

我想为 Spring Boot 应用程序创建 Docker 映像。它使用 gardle 作为构建工具。

在 bitbucket 存储库中,我可以看到放置了以下文件

    --> src
    --> build.gradle
    --> Dockerfile
    --> gradlew
    --> gradlew.bat

现在 Dockerfile 有以下内容

  FROM openjdk:8-jdk-alpine
  VOLUME /tmp
  ARG DEPENDENCY=target/dependency
  COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
  COPY ${DEPENDENCY}/META-INF /app/META-INF
  COPY ${DEPENDENCY}/BOOT-INF/classes /app
  EXPOSE 8080
  ENTRYPOINT ["java","-cp","app:app/lib/*","eds.billnq"]

当我尝试使用 Dockerfile 创建图像时出现错误

    target/dependency/BOOT-INF library not found 
    target/dependency/META-INF library not found

我的问题是为什么 docker 文件中没有 gradle 构建步骤? 还将在哪里创建目标/依赖项/?

【问题讨论】:

  • @WonChul Heo 我提到了它,但我仍然不明白为什么 Dockerfile 中没有 gradle 构建步骤
  • 您是否引用了设置here
  • @WonChul Heo 是的,由于一些错误,我也对其进行了修改。除了错误之外,我的主要问题是为什么我们不在 Dockerfile 中使用构建步骤?
  • 好吧,我对spring不太熟悉,但是你得到的错误是因为目标/依赖实际上应该是你机器中的一个目录。所以第 4 行和第 5 行基本上是在尝试将 BOOT-INF 和 META-INF 从您机器的 target/dependency 目录中复制到 docker 容器中。 Docker 文件中没有任何内容来实际创建目录,它只是使用它。

标签: spring-boot docker gradle microservices


【解决方案1】:

为什么这里的 docker 文件中没有 gradle 构建步骤?

看起来Dockerfile 期望应用程序在构建 Docker 映像之前已经构建(由 Gradle),并且生成的类文件和 jar 可以在 target/dependency 下的各种目录中使用。

@WonChul Heo 在 cmets 中提到的 Spring Boot Docker guide 介绍了如何使用 Gradle 构建 Docker 映像,特别是使用插件 gradle.plugin.com.palantir.gradle.docker:gradle-docker

还会在哪里创建目标/依赖项/?

我猜它们应该是在您运行 Gradle 构建时创建的,但如果不了解构建的配置方式,很难确定。

我建议您再次阅读该指南,并将其推荐的内容与您的代码库中的内容进行比较,尤其是 Gradle 构建定义。

归根结底,如果您从私有代码仓库中提取代码并且不知道如何构建,最好向致力于代码库的人寻求建议比来自 SO。

【讨论】:

  • 在给定的文章中,如果我想构建图像,那么下面的命令集是否正确? 1. $gradle build 2.$gradle run $docker build -t my-image .
  • 这篇文章提供了几种工作方式的选择,但它指向的主要内容之一是在 Gradle 中使用 Docker 插件。如果这样做,您将不会直接运行 docker build,但 Gradle 会为您完成。该页面显示:“您可以构建一个标记的 docker 映像,然后使用 Gradle 在一个命令中将其推送到远程存储库:./gradlew build docker”。我看不到你的整个存储库,所以我不能确切地说哪些命令会起作用,但如果我们认为 repo 的创建者遵循了该指南,那么看起来你应该运行./gradlew build docker
【解决方案2】:

使用 Gradle 时,您的 jar 文件将在 build/libs/{Your jar} 中生成

你能把ARG DEPENDENCY=target/dependency改成ARG DEPENDENCY=build/libs试试吗?它会起作用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2023-03-08
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多