无法在运行时使用 docker 映像中的环境变量更改文件的内容

Tam*_*san 4 containers docker dockerfile docker-compose

我正在创建一个将在内部运行 java 应用程序的图像。Java 应用程序进程创建命令从映像内部的配置文件获取参数。我想使用环境变量来设置这些配置文件内容。我不知道如何修改这些值。当我只是复制文件时,它只是复制环境变量名称。

FROM base-image
ARG SERVICE=test
ENV SERVICE $SERVICE
COPY runtime.properties /tmp/
RUN chmod 700 /tmp/runtime.properties
# here i am creating java process using those properties
Run Code Online (Sandbox Code Playgroud)

运行时属性

# few lines
SERVICE_NAME='${SERVICE}'
# few lines
Run Code Online (Sandbox Code Playgroud)

Pet*_*ger 6

Java 将按字面意思读取静态属性文件,并且在运行之前不会对这些文件进行任何插值。有几种选择可供您选择。

一种是在 Dockerfile 中添加一个步骤来搜索并替换文件中的值。

FROM java:alpine
ARG SERVICE=test
ENV SERVICE $SERVICE
COPY runtime.properties /tmp/
RUN sed -i -e 's/${SERVICE}/asd/g' /tmp/runtime.properties 
RUN chmod 700 /tmp/runtime.properties
Run Code Online (Sandbox Code Playgroud)

另一种选择是将属性文件更改为java类并直接读取环境变量。这提供了在独立运行的代码中具有默认值的优点。

public enum LocalConfig {
    INSTANCE;

    private String service = System.getenv("SERVICE") ==null ? "test" : System.getenv("SERVICE");
}
Run Code Online (Sandbox Code Playgroud)

如果您有大量环境变量,另一个选择是使用 envsubst,这将替换文件中的所有环境变量。但这取决于您的基础映像是什么。https://www.gnu.org/software/gettext/manual/html_node/envsubst-Inspiration.html

FROM java
ARG SERVICE=test
ENV SERVICE $SERVICE
COPY runtime.properties /tmp/
RUN envsubst < /tmp/runtime.properties > /tmp/runtime.properties 
RUN chmod 700 /tmp/runtime.properties
Run Code Online (Sandbox Code Playgroud)

我能想到的最后一个选项是在导入文件后解释环境变量。这里有一个很好的线程:关于 application.properties 文件和环境变量