如何在 Kuberetes 上的容器中将应用程序配置与 AP 分开?

我想部署一个在 Kubernetes 上使用外部配置的应用程序。我为 war 文件构建了一个 spring boot 应用程序并将其放入 websphere liberty。然后将 application.properties 放入我希望我的应用程序使用的/config/config(/config是的快捷方式)。/opt/ibm/wlp/usr/servers/defaultServer我写了一个 Dockerfile 如下:


FROM websphere-liberty:19.0.0.6-javaee8

USER root

RUN mkdir -p /ibank-pv && chown -R 1001:0 /ibank-pv

RUN mkdir -p /config/config/ && chown -R 1001:0 /config/config

COPY --chown=1001:0 ibank.war /config/apps/

COPY --chown=1001:0 server.xml /config

COPY --chown=1001:0 application.properties /config/config/

USER 1001

CMD ["/opt/ibm/wlp/bin/server","run","defaultServer"]

这是我的server.xml。我设置${server.config.dir}/config为配置资源文件夹。


<?xml version="1.0" encoding="UTF-8"?>

<server description="new server">

    <featureManager>

        <feature>javaee-8.0</feature>

    </featureManager>


    <basicRegistry id="basic" realm="BasicRealm">

        <!-- <user name="yourUserName" password="" />  -->

    </basicRegistry>


    <httpEndpoint id="defaultHttpEndpoint"

                  httpPort="9080"

                  httpsPort="9443" />


    <applicationManager autoExpand="true"/>


    <library id="configResources">

        <folder dir="${server.config.dir}/config" />

    </library>


    <application location="ibank.war">

        <classloader privateLibraryRef="configResources" />

    </application>

</server>

我添加这些代码来读取 application.properties 中的${server.config.dir}/config。


public class IbankServlet extends HttpServlet {


    private static final long serialVersionUID = 7526471155622776147L;


    private final Properties config;


    public IbankServlet() throws Exception {

        InputStream is = getClass().getResourceAsStream("application.properties");

        config = new Properties();

        config.load(is);

    }


}

但是,当我启动服务器我的应用程序时,它仍然读取application.propertieswar 文件中的内容。我必须做的是让我的应用程序application.properties在${server.config.dir}/config.


MMMHUHU
浏览 126回答 1
1回答

慕妹3146593

getClass().getResourceAsStream("relative-path")是在指定类的 Java 包中查找的问题吗?也就是说,无论哪个子目录对应的是.java的Java包IbankServlet。换句话说,您的application.propertiesWAR 文件是否埋在包子目录中?如果是这样,您需要更改为getClass().getResourceAsStream("/application.properties")(使用前导斜线),并将其移动到 WAR 文件中的类路径根目录,或者让 Docker 文件将其复制到正确的子目录中。但是,如果您IbankServlet实际上根本不在 Java 包中,那么这可能不是问题。)(但是,我承认,如果文件同时存在于您的 WAR 和“共享库”中,我不确定优先级。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java