使用fabric8 docker maven插件将MANIFEST.MF添加到docker映像

使用fabric8 docker maven插件将MANIFEST.MF添加到docker映像,maven,docker,manifest.mf,fabric8,docker-maven-plugin,Maven,Docker,Manifest.mf,Fabric8,Docker Maven Plugin,我已经成功地使用fabric8插件为Servlet Web应用程序创建了一个docker映像,使用了自定义Dockerfile 该图像基于tomcat,因此我需要将应用程序放入tomcat/webapps 为了优化图像,我没有直接插入war,而是在两个独立的层中插入war的扩展内容:一个用于WEB-INF\lib,另一个用于所有其他层 Image Layers: - WEB-INF\classes and resources - WEB-INF\lib - tomcat (base layer)

我已经成功地使用fabric8插件为Servlet Web应用程序创建了一个docker映像,使用了自定义Dockerfile

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

Image Layers:
- WEB-INF\classes and resources
- WEB-INF\lib
- tomcat (base layer)
这样,如果我创建了一个新版本,但libs与旧版本相同,那么远程服务器只需要拉取应用层

我从maven war插件生成的文件夹“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>

org.apache.maven.plugins
maven战争插件
3.2.0
假的
/*...*/
io.fabric8
docker maven插件
0.30.0
真的
${project.version}-${docker image tag}
${project.basedir}/src/main/docker
目标
${project.build.directory}/${project.build.finalName}
slimWar
WEB-INF\lib\**
假的
${project.build.directory}/${project.build.finalName}
自由基
WEB-INF\lib\**
假的

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

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

pom.xml

<build>
    <contextDir>${project.basedir}/src/main/docker/${docker-contextDir}</contextDir>
    <assembly>
       <descriptorRef>rootWar</descriptorRef>
    </assembly>
</build>
这一次MANIFEST.MF将在那里

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

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