java - 如何在 Kubernetes 上将应用程序配置与容器中的 API 分离?

标签 java spring-boot docker kubernetes websphere-liberty

我想在 Kubernetes 上部署一个使用外部配置的应用程序。我构建了一个 spring boot 应用程序到一个 war 文件并将其放入 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>

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

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);
    }

}

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

最佳答案

问题是 getClass().getResourceAsStream("relative-path")在该指定类的 Java 包中查找?即无论哪个子目录都对应IbankServlet的Java包。换句话说,WAR 文件中的 application.properties 是否埋藏在包子目录中?

如果是这样,您需要更改为 getClass().getResourceAsStream("/application.properties") (带有前导斜杠),并将其移至 WAR 文件中的类路径根目录,或者让 Docker 文件将其复制到正确的子目录中。

但是,如果您的 IbankServlet 实际上根本不在 Java 包中,那么这可能不是问题所在。)

(但是,我承认,如果文件同时存在于您的 WAR 和“共享库”中,我不确定其优先级。)

关于java - 如何在 Kubernetes 上将应用程序配置与容器中的 API 分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56801434/

相关文章:

java - 从表中检索不同类型并使用 myBatis 进行映射

c# - 运行 dotnet publish -c Release -o out 时,在 ASP.NET Core 项目中构建 Dockerfile 失败

php - Gitlab Ci 使用 docker 和 mysql 服务缓慢构建

docker - 如何配置docker容器代理?

java - spring-boot application.properties 中的环境变量错误

java - 生成 XML 时如何在 CDATA 中保留换行符?

java - 用于 Java 的 SLOC 工具,具有人年估计功能

java - 为什么 repaint() 在此方法中不能正常工作

java - 选择哪个选项来设计此 API 端点

java - 适用于每个输入