如何在 Kubernetes 上的容器中将应用程序配置与 AP 分开?
How to separate application config from AP in container on Kuberetes?
我想在 Kubernetes 上部署一个使用外部配置的应用程序。我将 spring 引导应用程序构建到 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")
在指定class的Java包中查找的问题吗?即任何子目录对应IbankServlet
的Java包。换句话说,WAR 文件中的 application.properties
是否埋在包子目录中?
如果是这样,您需要更改为 getClass().getResourceAsStream("/application.properties")
(带前导斜线),并将其移动到 WAR 文件中的 class 路径根目录,或者将您的 Docker 文件复制到正确的子目录中。
但是,如果您的 IbankServlet
实际上根本不在 Java 包裹中,这可能不是问题所在。)
(但是,我承认,如果文件同时存在于您的 WAR 和 "shared library" 中,我不确定优先级。)
我想在 Kubernetes 上部署一个使用外部配置的应用程序。我将 spring 引导应用程序构建到 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")
在指定class的Java包中查找的问题吗?即任何子目录对应IbankServlet
的Java包。换句话说,WAR 文件中的 application.properties
是否埋在包子目录中?
如果是这样,您需要更改为 getClass().getResourceAsStream("/application.properties")
(带前导斜线),并将其移动到 WAR 文件中的 class 路径根目录,或者将您的 Docker 文件复制到正确的子目录中。
但是,如果您的 IbankServlet
实际上根本不在 Java 包裹中,这可能不是问题所在。)
(但是,我承认,如果文件同时存在于您的 WAR 和 "shared library" 中,我不确定优先级。)