use*_*mda 7 containers environment-variables docker
我要求在应用程序运行之前,它的某些部分需要读取环境变量.为此,我有以下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"]
Run Code Online (Sandbox Code Playgroud)
上面的envsubst行读取(应该读取)一个env变量$MYENV并替换它.但是当我打开文件app.js时,它是空的.我检查了容器中是否存在环境变量,它确实存在.是什么原因,它的价值不被读取和替换?我也在teh容器中尝试了相同的命令,它可以工作.它只在我运行图像时不起作用
我遇到了同样的问题,经过大量研究和通过互联网钓鱼。我设法找到了解决这个问题的一些方法。下面我将列出它们以及在此“答复帖子”时可识别的风险
解决方案:
1.)apt-get install -y gettext它是一个标准的 GNU 包语言库,它包含的库之一是 envsubst`,我可以确认它适用于 docker UBUNTU:latest,并且它应该适用于每个风味版本。
2.)npm install envsub取决于“用例”——这种方法将得到基于节点的项目的更好支持。
3.)enstub cli project lib在我看来,从随机的陌生人那里下载自定义 cli 似乎有点矫枉过正,但这也是另一种选择。
风险:
apt-get install -y gettext:
1.) gettext- 这种方法对于虚拟机来说并不理想,就像任何包库一样,它需要随着时间的推移进行维护和更新。然而,这对于 docker 来说并不是必需的,因为一旦容器初始化并启动并运行,我们就可以创建一个 bash 脚本来添加包、替换环境变量,然后删除包。
2.) 对于虚拟机来说这是一个坏主意,因为它可以用来执行任意代码
npm 安装 ensub
1.) envsub- 更新包,如果您处理不同的堆栈并且不使用 Nodejs,则这种方法并不理想。
注意:对于那些开发 PHP 应用程序的人来说,还有一个 PHP 版本,如果您需要自定义环境,它似乎可以使用 PHP 的 cli。
资源:
这很可能是因为在运行映像时$MYENV不可用envsubst.
每个RUN命令都在自己的shell上运行.
来自Docker文档:
RUN(命令在shell中运行 - /bin/sh -c - shell形式)
您还需要获取配置文件,例如,如果文件中有$MYENV环境变量.bashrc,您可以像这样修改Dockerfile:
RUN source ~/.bashrc && envsubst < src/js/envapp.js > src/js/app.js
Run Code Online (Sandbox Code Playgroud)