envsubst 命令卡在容器中

envsubst command getting stuck in a container

我有一个要求,在应用程序 运行s 之前,它的某些部分需要读取环境变量。为此,我有以下 docker 文件

FROM nodesource/jessie:0.12.7

# install gettext for envsubst
RUN apt-get update
RUN apt-get install -y gettext-base

# cache package.json and node_modules to speed up builds
ADD package.json package.json
RUN npm install

# Add  source files
ADD src src

# Substiture value for backend endpoint env var
RUN envsubst < src/js/envapp.js > src/js/app.js

ADD node_modules node_modules
EXPOSE 8000
CMD ["npm","start"]

上面的 envsubst 行读取(应该读取)一个环境变量 $MYENV 并替换它。但是当我打开文件 app.js 时,它是空的。 我检查了环境变量是否存在于容器中,它确实存在。有什么理由不读取和替换它的值? 我还在容器中尝试了相同的命令并且它有效。它只在我 运行 图像

时不起作用

这可能是因为当您 运行 图片时 $MYENV 不适用于 envsubst

每个 运行 命令 运行 独立 shell。

来自 Docker 文档:

RUN (the command is run in a shell - /bin/sh -c - shell form)

您还需要获取配置文件的来源,例如,如果 $MYENV 环境变量在 .bashrc 文件中可用,您可以像这样修改 Docker 文件:

RUN source ~/.bashrc && envsubst < src/js/envapp.js > src/js/app.js

我建议你使用 Node,使用 npm envsub 模块。

此模块经过充分测试,开发时考虑了 docker。

当您已经拥有完整的 Node 武器库时,它避免了依赖其他依赖项的需要。

envsub 被描述为

envsub is envsubst for NodeJS

NodeJS global CLI module providing file-level environment variable substitution via Handlebars

我是包的作者。我想你会喜欢的。

我遇到了同样的问题,经过大量研究和通过互联网钓鱼。我设法找到了一些解决这个问题的方法。下面我将列出它们和在这个“回答 post”

时可识别的风险

解决方案:

1.) apt-get install -y gettext 它是一个标准的 GNU 包语言库,它包含的这些库之一是 envsubst`,我可以确认它适用于 docker UBUNTU:latest 和它应该适用于每个口味的版本。

2.) npm install envsub 取决于“用例”——基于节点的项目会更好地支持这种方法。

3.) enstub cli project lib 在我看来,从随机的陌生人那里下载自定义 cli 似乎有点矫枉过正,但这也是另一种选择。

风险:

  • apt-get 安装-y gettext:

    1.) gettext - 与任何包库一样,这种方法对于 VM 来说并不理想,它需要随着时间的推移进行维护和更新。但是,这对于 docker 来说不是必需的,因为一旦容器初始化并启动 运行 我们就可以创建一个 bashscript 来添加包,替换环境变量,然后删除包。

    2.) 这对 VM 来说不是个好主意,因为它可以用来执行任意代码

  • npm 安装 ensub

    1.) envsub - 更新包,如果您处理不同的堆栈而不使用 nodejs,则此方法不是理想的。

注意: 对于那些开发 PHP 应用程序的人来说,还有一个 PHP 版本,如果您需要自定义环境,它似乎可以使用 PHP 的 cli。

资源:

我在 Docker 中遇到了一些关于 envsubst 的问题。 由于某些原因,当我尝试将输出复制到同一文件时,envsubst 不起作用。例如,这不起作用:

RUN envsubst < file.conf > file.conf

但是当我尝试使用临时文件时,问题消失了:

RUN envsubst < file.conf > file.conf.temp && cp -f file.conf.temp file.conf