【问题标题】:Packaging war file into docker image in multiple layers将war文件多层打包成docker镜像
【发布时间】:2020-03-23 04:25:19
【问题描述】:

我正在尝试将带有战争包装的 Spring Boot 应用程序放入 docker 映像中。最简单的方法是使用以下 Dockerfile:

FROM adoptopenjdk/openjdk8:alpine-slim
VOLUME /tmp
COPY target/demo.war app.war
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.war"]

按照这种方法,我每次更改项目的源代码时都会创建一个大层。另一种方法是将战争拆分为不同的 docker 层,如本文所述:https://spring.io/blog/2018/11/08/spring-boot-in-a-container#a-better-dockerfile

但是,恐怕这只能通过 jar 包装而不是战争。我说的对吗?

提前致谢。

【问题讨论】:

标签: spring-boot docker war


【解决方案1】:

这是我获得带有战争应用程序的多层 docker 图像的方式。

首先打开war文件,看看哪些文件夹需要复制到镜像中:

jar -xf youapp.war

在我的项目中,war 文件由以下文件夹组成:

/WEB-INF
/META-INF
/resources
/org

基于此,我创建了如下 Dockerfile:

FROM openjdk:8-jdk-alpine AS builder
WORKDIR target/dependency
ARG APPWAR=target/*.war
COPY ${APPWAR} app.war
RUN jar -xf ./app.war
RUN mv WEB-INF/lib-provided lib-provided
RUN mv WEB-INF/lib lib

FROM openjdk:8-jre-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY --from=builder ${DEPENDENCY}/lib /app/WEB-INF/lib
COPY --from=builder ${DEPENDENCY}/lib-provided /app/WEB-INF/lib-provided
COPY --from=builder ${DEPENDENCY}/org /app/org
COPY --from=builder ${DEPENDENCY}/resources /app/resources
COPY --from=builder ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=builder ${DEPENDENCY}/WEB-INF /app/WEB-INF

ENTRYPOINT ["java","-cp","/app/WEB-INF/classes:/app/WEB-INF/lib/*:/app/WEB-INF/lib-provided/*","com.company.project.Application"]

希望有用。

【讨论】:

    【解决方案2】:

    尝试使用 Tomcat Docker 映像来部署您的 warfile。例如:

    FROM tomcat:latest
    COPY target/demo.war /usr/local/tomcat/webapps/
    

    参考:

    https://hub.docker.com/_/tomcat

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2019-06-24
      • 2020-01-28
      • 1970-01-01
      相关资源
      最近更新 更多