如何在部署Wildfly的Docker容器内置.m2仓库解决apiman自定义策略加载问题
问题原因
apiman部署在Docker中无法读取自定义策略war包的核心原因是:容器内运行apiman的jboss用户默认家目录/home/jboss下不存在对应的.m2仓库目录,你本地的策略构件没有被打包进镜像中,自然无法读取。
内置.m2仓库的实现方案
多阶段构建完全可以满足需求,你可以选择以下两种方案实现:
方案1:多阶段构建(推荐,不依赖本地Maven环境)
第一阶段完成自定义策略的编译和安装,第二阶段直接将生成的Maven仓库内容拷贝到Wildfly镜像中,修改后的Dockerfile如下:
# 第一阶段:构建自定义策略,生成Maven仓库构件 FROM maven:3.8.6-jdk-8 AS builder # 拷贝你的自定义策略源码到构建容器,替换为你本地源码的实际路径 COPY ./your-custom-policy-source /tmp/policy WORKDIR /tmp/policy # 执行install,将策略包安装到构建容器的.m2仓库 RUN mvn clean install -DskipTests # 第二阶段:构建最终的apiman运行镜像 FROM jboss/wildfly:10.1.0.Final COPY apiman_folder ${JBOSS_HOME} USER root # 从第一阶段拷贝构建好的策略构件到jboss用户的.m2目录 COPY --from=builder /root/.m2/repository /home/jboss/.m2/repository # 统一修改权限,保证jboss用户可读可写 RUN chown -R jboss:0 ${JBOSS_HOME} /home/jboss/.m2 \ && chmod -R g+rw ${JBOSS_HOME} /home/jboss/.m2 USER jboss ENTRYPOINT ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-c", "standalone-apiman.xml"]
方案2:直接拷贝本地已构建的.m2内容
如果你已经在本地完成了策略的mvn install,也可以跳过构建阶段,直接把本地对应构件拷进镜像,修改Dockerfile添加如下内容即可:
FROM jboss/wildfly:10.1.0.Final COPY apiman_folder ${JBOSS_HOME} USER root # 拷贝本地已构建的策略构件到容器内,替换为你本地策略对应的.m2路径 COPY /your/local/.m2/repository/your/policy/group/id /home/jboss/.m2/repository/your/policy/group/id # 统一修改权限 RUN chown -R jboss:0 ${JBOSS_HOME} /home/jboss/.m2 \ && chmod -R g+rw ${JBOSS_HOME} /home/jboss/.m2 USER jboss ENTRYPOINT ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-c", "standalone-apiman.xml"]
验证方法
镜像构建完成启动容器后,执行以下命令确认配置生效:docker exec -it 你的容器ID ls -la /home/jboss/.m2/repository/你的策略group路径
如果能输出对应的war和pom文件,说明.m2配置正常,apiman可以正常读取自定义策略。
内容的提问来源于stack exchange,提问作者TheAkashKamble
相关产品推荐
相关产品推荐

