使用fabric8 docker maven插件将MANIFEST.MF添加到docker映像
我已经成功地使用fabric8插件为Servlet Web应用程序创建了一个docker映像,使用了自定义Dockerfile 该图像基于tomcat,因此我需要将应用程序放入使用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)
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