如何将dockerfile转换为Maven的jib插件的XML,特别是“RUN”和“HEALTHCHECK”部分?

如何解决如何将dockerfile转换为Maven的jib插件的XML,特别是“RUN”和“HEALTHCHECK”部分?

我有一个类似的 dockerfile:

# openjdk:11-jre include 'wget' and 'curl',while openjdk:11-jre-slim does not
FROM openjdk:11-jre

ENV VERSION=2.28.1
ENV DIR=/home/wiremock
ENV JAR=wiremock-jre8-standalone-$VERSION.jar
ENV FULLPATH=$DIR/$JAR

# grab wiremock standalone jar
RUN mkdir -p $DIR
RUN useradd --no-log-init -r wiremock
RUN wget https://repo1.maven.org/maven2/com/github/tomakehurst/wiremock-jre8-standalone/$VERSION/$JAR \
        -O $FULLPATH
WORKDIR $DIR
# copy stub files to container
COPY --chown=wiremock:root src/main/resources/stubs/__files __files/
COPY --chown=wiremock:root src/main/resources/stubs/mappings mappings/
USER wiremock
EXPOSE 8080 8443
# healthcheck(wait 10s to start,then wait 10s interval and check,if wait more than 1s,is fail. Retry 3 times
# with same interval before marking as unhealthy)
HEALTHCHECK --start-period=10s --interval=10s --timeout=1s --retries=3 \
    CMD curl http://localhost:8080/__admin && curl -k https://localhost:8443/__admin || exit 1
CMD java -jar $FULLPATH --https-port 8443 --verbose

现在,我找不到使用 maven-jib-plugin 的正确方法。

依赖项将作为依赖项复制,而不是通过 wget 下载:

<dependency>
    <groupId>com.github.tomakehurst</groupId>
    <artifactId>wiremock-jre8-standalone</artifactId>
    <version>${wiremock.standalone.version}</version>
    <scope>runtime</scope>
</dependency>

但是我不确定是否所有的事情都可以在 jib 中完成,比如创建用户等等。

现在,我有了这个 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>foo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>app</artifactId>
    <properties>
        <docker.registry>xxx</docker.registry>
        <docker.base.image>${docker.registry}/base/openjdk11:latest</docker.base.image>
        <docker.image>app</docker.image>
        <https.port>8443</https.port>
        <work.dir>/home/wiremock</work.dir>
        <jar>wiremock-jre8-standalone-${wiremock.standalone.version}.jar</jar>
        <full.path>${work.dir}/${jar}</full.path>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.github.tomakehurst</groupId>
            <artifactId>wiremock-jre8-standalone</artifactId>
            <version>${wiremock.standalone.version}</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.basedir}/libs</outputDirectory>
                            <includeArtifactIds>wiremock-jre8-standalone</includeArtifactIds>
                        </configuration>
                    </execution>
                </executions>

            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <from>
                        <image>${docker.base.image}</image>
                    </from>
                    <to>
                        <image>${docker.image}</image>
                        <tags>
                            <tag>latest</tag>
                        </tags>
                    </to>
                    <extraDirectories>
                        <paths>
                            <path>
                                <from>libs/</from>
                                <into>${work.dir}</into>
                            </path>
                            <path>
                                <from>src/main/resources/stubs/__files</from>
                                <into>${work.dir}/__files</into>
                            </path>
                            <path>
                                <from>src/main/resources/stubs/mappings</from>
                                <into>${work.dir}/mappings</into>
                            </path>
                        </paths>
                        <permissions>
                            <permission>
                                <file>${work.dir}/**/*.*</file>
                                <mode>744</mode>
                            </permission>
                        </permissions>
                    </extraDirectories>
                    <container>
                        <user>wiremock:root</user>
                        <appRoot>${work.dir}</appRoot>
                        <workingDirectory>${work.dir}</workingDirectory>
                        <ports>
                            <port>8080</port>
                            <port>${https.port}</port>
                        </ports>
                        <args> <!-- dockerfile CMD part-->
                            <arg>-jar</arg>
                            <arg>${full.path}</arg>
                            <arg>--https-port</arg>
                            <arg>${https.port}</arg>
                            <arg>--verbose</arg>
                        </args>
                        <mainClass>com.github.tomakehurst.wiremock.standalone.WireMockServerRunner</mainClass>
                    </container>
                    <!-- <containerizingMode>packaged</containerizingMode> -->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

当我运行 mvn jib:dockerBuild 时,镜像构建成功(好消息!),我在日志中看到依赖 jar 被复制到 libs,然后复制到容器中。

但是当我运行它时,我看到错误:

docker: Error response from daemon: unable to find user wiremock: no matching entries in passwd file.

所以 jib 没有为我创建用户。

另外,我认为 HEALTHCHECK 也没有完成。

我可以跳过新用户创建和健康检查,因为现在不推荐也不支持它们(https://github.com/GoogleContainerTools/jib/issues/676,https://github.com/GoogleContainerTools/jib/issues/1029),但是当我想像在 dockerfile 中那样运行 jar 时,我看到另一个错误:

$ docker run  -p 8080:8080 -p 8443:8443 app
Exception in thread "main" joptsimple.UnrecognizedOptionException: j is not a recognized option
        at joptsimple.OptionException.unrecognizedOption(OptionException.java:108)
        at joptsimple.OptionParser.validateOptionCharacters(OptionParser.java:633)
        at joptsimple.OptionParser.handleShortOptionCluster(OptionParser.java:528)
        at joptsimple.OptionParser.handleShortOptionToken(OptionParser.java:523)
        at joptsimple.OptionParserState$2.handleArgument(OptionParserState.java:59)
        at joptsimple.OptionParser.parse(OptionParser.java:396)
        at com.github.tomakehurst.wiremock.standalone.CommandLineOptions.<init>(CommandLineOptions.java:179)
        at com.github.tomakehurst.wiremock.standalone.WireMockServerRunner.run(WireMockServerRunner.java:52)
        at com.github.tomakehurst.wiremock.standalone.WireMockServerRunner.main(WireMockServerRunner.java:134)

我看到图像是这样构建的:

[INFO] Container entrypoint set to [java,-cp,@/home/wiremock/jib-classpath-file,com.github.tomakehurst.wiremock.standalone.WireMockServerRunner]
[INFO] Container program arguments set to [-jar,/home/wiremock/wiremock-jre8-standalone-2.28.1.jar,--https-port,8443,--verbose]

如何正确地将此 dockerfile 转换为 XML 中的 jib 配置?

解决方法

好吧,我终于找到了:

我应该设置 <container><entrypoint>,而不是 <args>。不需要 <mainClass>

<container>
    ...
    <entrypoint>java,-jar,${full.path},--https-port,${https.port},--verbose</entrypoint>
</container>
<!--  <containerizingMode>packaged</containerizingMode>-->

然后入口点是这样的:

[INFO] Container entrypoint set to [java,/home/wiremock/wiremock-jre8-standalone-2.28.1.jar,8443,--verbose]

Wiremock jar 运行正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-