使用 fabric8 docker-maven-plugin 添加 MANIFEST.MF 到 docker 图像

Add MANIFEST.MF to docker image with fabric8 docker-maven-plugin

我已经使用自定义 Dockerfile 为 Servlet WebApp 使用 fabric8 插件成功创建了 docker 图像。

图像是基于tomcat,所以我需要把应用放在tomcat/webapps 为了优化图像,我没有直接插入 war,而是将它的扩展内容插入两个单独的层中:一层用于 WEB-INF\lib,另一层用于所有其他层。

Image Layers:
- WEB-INF\classes and resources
- WEB-INF\lib
- tomcat (base layer)

这样如果我创建一个新版本但是libs和旧版本一样,远程服务器只需要拉取app层

我正在从 maven-war-plugin 生成的文件夹“target/MyProject”中复制 war 的内容,然后从中创建“MyProject.war" 但是这个文件夹不包含META-INF\MANIFEST.MF文件(是直接在war中创建的吗?)

有没有办法在某个文件夹中创建清单文件,以便我可以将其复制到 docker 图像中?

这里是pom.xml

的一部分
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <archive>
                    <manifestEntries>
                        /*...*/
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>io.fabric8</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.30.0</version>
            <extensions>true</extensions>

            <configuration>
                <images>
                    <image>
                        <name>${project.version}-${docker-image-tag}</name>
                        <build>
                            <contextDir>${project.basedir}/src/main/docker</contextDir>
                            <assembly>
                                <name>target</name>
                                <inline>
                                    <fileSets>
                                        <fileSet>
                                            <directory>${project.build.directory}/${project.build.finalName}</directory>
                                            <outputDirectory>slimWar</outputDirectory>
                                            <excludes>
                                                <exclude>WEB-INF\lib\**</exclude>
                                            </excludes>
                                            <useDefaultExcludes>false</useDefaultExcludes>
                                        </fileSet>
                                        <fileSet>
                                            <directory>${project.build.directory}/${project.build.finalName}</directory>
                                            <outputDirectory>libs</outputDirectory>
                                            <includes>
                                                <include>WEB-INF\lib\**</include>
                                            </includes>
                                            <useDefaultExcludes>false</useDefaultExcludes>
                                        </fileSet>
                                    </fileSets>
                                </inline>
                            </assembly>
                        </build>
                    </image>
                </images>
            </configuration>
        </plugin>

我找到了解决方案,以防有人遇到这个问题。 诀窍是直接添加和解压 war , 但这样做会导致一层带有 war 和一层(或更多)带有提取的文件

为了解决这个问题,我们可以使用 docker 多阶段构建:

pom.xml

<build>
    <contextDir>${project.basedir}/src/main/docker/${docker-contextDir}</contextDir>
    <assembly>
       <descriptorRef>rootWar</descriptorRef>
    </assembly>
</build>

这会将工件作为 ROOT.war 添加到 /maven 目录(图像内)

Docker 文件

FROM busybox AS unzippedWar

ADD /maven/ROOT.war /
RUN mkdir -p /war/slimWar
RUN mkdir -p /war/libs
RUN unzip -qq /ROOT.war -d /war/slimWar
RUN mkdir -p /war/libs/WEB-INF/lib
RUN mv /war/slimWar/WEB-INF/lib/* /war/libs/WEB-INF/lib

FROM tomcat:9-jdk8-openjdk-slim

RUN rm -rf  /usr/local/tomcat/webapps/*

COPY --from=unzippedWar /war/libs /usr/local/tomcat/webapps/ROOT/
COPY --from=unzippedWar /war/slimWar /usr/local/tomcat/webapps/ROOT/

EXPOSE 80

这次 MANIFEST.MF 会出现

挑剔一点,唯一的缺点(但这几乎不是问题)是需要手动删除剩余的中间图像,如 here 所述。