0

我已经使用自定义 Dockerfile 为 Servlet WebApp 成功创建了一个带有 fabric8 插件的 docker 映像。

该图像基于tomcat,因此我需要将应用程序放入tomcat/webapps 以优化图像,我不是直接插入战争,而是在两个单独的层中插入它的扩展内容:一层用于WEB-INF\lib所有其他层。

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

这样,如果我创建一个新版本但库与旧版本相同,远程服务器只需要拉应用层

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

有没有办法在某个文件夹中创建清单文件,以便我可以将其复制到 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>
4

1 回答 1

0

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

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

pom.xml

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

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

Dockerfile

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 将在那里

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

于 2019-09-20T23:21:05.563 回答