docker - 如何在没有 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 映像。这是我尝试过的事情。
为 Dockerfile 使用 Spotify maven 插件。尝试运行 ./mvnw 来构建 JAR 以及 Docker 映像。但是,我没有在 boot2docker 中安装 Java。所以 Maven 包装器 ./mvnw 无法运行。
我尝试通过基于 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 新手。评论和答案表示赞赏!
解决方案
您可以安装 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 并在您的构建中运行它。
推荐阅读
- twitter-bootstrap - Bootstrap 4:导航栏品牌左侧,链接中心,其他链接右侧
- perl - 奇怪的“使用未初始化的值”,正则表达式错误
- blockchain - 在虚拟机上安装超级账本结构对等体
- kubernetes - 如何使 Horizontal Pod Autoscaler 按百分比减少阈值缩小 pod 副本?
- python - 从 apache 日志中删除 2 次后获取 IP 的正则表达式
- c# - 如何使 autofac KeyFilter 在 asp.net-core web api 中工作?
- python - 我在使用 tkinter 运行另一个 Python 文件时遇到问题
- python - 如何使 Pygame Zero 窗口全屏?
- excel - 查找包含特定日期的行。错误 91
- ruby-on-rails - Rails,如何从急切加载路径中删除目录