在 docker 容器中编辑 war 文件内的文件

Edit a file inside war file in a docker container

我有一个基于 openjdk:8-jre-alpine 基本图像的 docker 图像。我使用 java -jar ... 在容器内执行一个 war 文件。我的 war 文件服务于 Web 应用程序,我的 war 文件 conf.json 中有一个文件,我在其中进行了一些配置设置。我想根据docker容器的环境变量修改一些配置。

例如,我有一个 "gateway_url":"some_url" 的字段,我需要将其更改为 "gateway_url":"${gateway_url}"。如果这个配置文件不在 war 文件中,我会简单地执行类似

awk -v val="$gateway_url" '{gsub("some_url",val);print}' > conf.json

在我的入口点脚本中编辑 conf.json 文件。在这种情况下,我无法直接访问配置文件,因为它位于 war 文件中。

如何解决这个问题?

约束

我不想在我的容器中使用 jar 实用程序来更新 war 文件中的文件,因为它会显着增加我的容器的大小(默认情况下不存在)并附带整个 JDK 安装)。

找到解决方案:

这是我在入口点脚本中所做的:

zipedit(){
    echo "Usage: zipedit archive.zip folder/file.txt"
    curdir=$(pwd)
    unzip "" "" -d /tmp
    cd /tmp
    content=$(cat "")
    rm -f ""
    echo "$content" | awk -v gat="$GAT_URL" -v tam="$TAM_URL" -v prom="$PROMPT_URL" -v ecm="ECM_URL" \
    '{gsub("gat_url",gat);gsub("prompt_url", prom);print}' > "" &&
    zip --update "$curdir/"  ""
    # remove this line to just keep overwriting files in /tmp
    rm -f "" # or remove -f if you want to confirm
    cd "$curdir"
}

zipedit application.war base/conf/conf.json

它同时使用 unzipzip 实用程序。我必须先使用 apk add zip 安装 zip,然后我才能将环境变量添加到 docker 容器中的 war 文件内的文件中。