【问题标题】:Replace string placeholder with value in sh file用 sh 文件中的值替换字符串占位符
【发布时间】:2024-01-13 09:34:01
【问题描述】:

我不得不说,在 Windows 环境 /Powershell 中我会立即完成,但由于我必须在 docker Linux 映像中执行这个 shell 脚本,所以我需要你的帮助。

我有一个 node.js env 文件,我在其中存储了我的环境变量,因此 nodejs 应用程序可以稍后使用它们。我设置了一些占位符,我需要用我从 docker @ 获得的 event args 参数替换它们987654321@.

.env 文件的内容是

NodePort={NodePort}
DBServer={DBServer}
DBDatabaseName={DBDatabaseName}
DBUser={DBUser}
DBPassword={DBPassword}
DBEncrypt= {DBEncrypt}
RFIDNodeUrlRoot={RFIDNodeUrlRoot}
RFIDStartMethod={RFIDStartMethod}
RFIDStopMethod={RFIDStopMethod}
RFIDGetTagsMethod={RFIDGetTagsMethod}

我不知道打开文件,替换环境变量中的值,然后保存它的最佳方法。

谁能帮帮我? 谢谢

【问题讨论】:

  • 值究竟是如何进入容器的?如果您通过docker run -e 选项传递它们,它们已经在进程环境中设置,您的节点代码应该在process.env 中看到它们;您并不特别需要 .env 文件。
  • 你是对的,但是这个应用程序可以在本地或容器上运行,并且在它从 .env 加载的原始(前提)中运行,所以我需要从容器中抽象出来

标签: docker dockerfile sh


【解决方案1】:

您可以使用envsubst,它是gettext-base 包的一部分

见:

.env.temp

NodePort=${NodePort}   # notice the `$` before `{}`
DBServer=${DBServer}
..

假设您使用

设置环境变量

docker run -e "NodePort=8080" -e "DBServer=foo"

在该容器中,您将不得不使用一些 entrypoint.sh 脚本来运行:

envsubst \$NodePort,$\DBServer,.. < .env.temp > .env

然后启动您的应用程序,将 .env 传递给您的 nodejs 应用程序。

作为替代方案,您也可以使用sed 编辑.env,这可能很难理解。

subst_env() {
  eval val="\$$1"                  # expands environment variable to val
  sed -i "s%\$$1%${val}%g" $2      # using % as sed-delimiter to avoid escaping slashes in urls
}

subst_env 'ENV_DOCKER_DOMAIN' .env

【讨论】:

    最近更新 更多