首页 > 解决方案 > 如何在没有 JAR 的情况下为 Spring Boot 应用程序构建 Docker 映像

问题描述

我已按照这些教程为我的 Spring Boot 应用程序构建 Docker 映像,该应用程序使用 Maven 作为构建工具。我在 Windows 10 机器上使用 boot2docker VM,将我的项目从我的 Bitbucker 存储库克隆到 VM。

https://spring.io/guides/gs/spring-boot-docker/

https://www.callicoder.com/spring-boot-docker-example/

我理解所告诉的说明,但是,我未能构建正确的 Docker 映像。这是我尝试过的事情。

  1. 为 Dockerfile 使用 Spotify maven 插件。尝试运行 ./mvnw 来构建 JAR 以及 Docker 映像。但是,我没有在 boot2docker 中安装 Java。所以 Maven 包装器 ./mvnw 无法运行。

  2. 我尝试通过基于 openjdk:8-jdk-alpine 映像的 Dockerfile 构建 JAR。我RUN ./mvnw package在 Dockerfile 中添加了指令。然后运行docker build -t <my_project> .构建 Docker 镜像。它在 RUN 指令处失败,声称/bin/sh: mvnw: not found The command '/bin/sh -c mvnw package' returned a non-zero code: 127

我的Dockerfile,位于mvnw所在的目录:

MAINTAINER myname

VOLUME /tmp

RUN ./mvnw package

ARG JAR_FILE=target/myproject-0.0.1-SNAPSHOT.jar

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

对于 1,我需要在 Docker 引擎所在的操作系统中安装 Java。但我认为这不是一个好习惯,因为这会降低可移植性。

对于2,首先,我不知道如何在Dockerfile中成功运行./mvnw。其次,我不确定通过 Dockerfile 构建 Spring Boot JAR 是否是一个好习惯,因为我没有看到任何“Docker for Spring Boot”教程告诉这样做。

那么,解决我的情况的最佳做法是什么?我是 Docker 新手。评论和答案表示赞赏!

标签: dockerspring-bootdockerfiledocker-image

解决方案


您可以安装 maven 并直接在构建中运行编译。通常,这将是一个多阶段构建,以避免在推送的映像中包含整个 jdk:

FROM openjdk:8-jdk-alpine as build
RUN apk add --no-cache maven
WORKDIR /java
COPY . /java
RUN mvn package -Dmaven.test.skip=true
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/java/target/myproject-0.0.1-SNAPSHOT.jar"]

上面是我过去做过的同一个例子的返工的精简版本。您可能需要在入口点调整文件名,但关键步骤是安装 maven 并在您的构建中运行它。


推荐阅读