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。
资源:
- GetText 包库信息:https://www.gnu.org/software/gettext/
- GetText 风险 - https://ubuntu.com/security/notices/USN-3815-2
- PHP-GetText - apt-get 安装 -y php-gettext
- 自定义 ensubst cli:https://github.com/a8m/envsubst
我在 Docker 中遇到了一些关于 envsubst
的问题。
由于某些原因,当我尝试将输出复制到同一文件时,envsubst
不起作用。例如,这不起作用:
RUN envsubst < file.conf > file.conf
但是当我尝试使用临时文件时,问题消失了:
RUN envsubst < file.conf > file.conf.temp && cp -f file.conf.temp file.conf
我有一个要求,在应用程序 运行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。
资源:
- GetText 包库信息:https://www.gnu.org/software/gettext/
- GetText 风险 - https://ubuntu.com/security/notices/USN-3815-2
- PHP-GetText - apt-get 安装 -y php-gettext
- 自定义 ensubst cli:https://github.com/a8m/envsubst
我在 Docker 中遇到了一些关于 envsubst
的问题。
由于某些原因,当我尝试将输出复制到同一文件时,envsubst
不起作用。例如,这不起作用:
RUN envsubst < file.conf > file.conf
但是当我尝试使用临时文件时,问题消失了:
RUN envsubst < file.conf > file.conf.temp && cp -f file.conf.temp file.conf