使用 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 所述。
我已经使用自定义 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 所述。