我有一个要求,在应用程序运行之前,它的某些部分需要读取环境变量。为此,我有下面的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行读取(应该读取) env变量$MYENV并替换它。但是当我打开文件app.js时,它是空的。我检查了容器中是否存在环境变量,并且它确实存在。它的价值没有被读取和替换的原因吗?我还在teh容器中尝试了相同的命令,它可以工作。只有当我运行映像时,它才不能工作。
发布于 2015-11-05 17:48:08
这很可能是因为在运行映像时,$MYENV对envsubst不可用。
每个RUN命令都在自己的shell上运行。
来自码头工人的文件:
运行(命令以shell - /bin/sh -c - shell形式运行)
您还需要源配置文件,例如,如果$MYENV环境变量在.bashrc文件中可用,您可以像下面这样修改您的Dockerfile:
RUN source ~/.bashrc && envsubst < src/js/envapp.js > src/js/app.js发布于 2020-09-04 19:09:09
我遇到了同样的问题,经过了大量的研究和通过互联网钓鱼。我设法找到了一些解决这个问题的方法。下面我将列出它们和可识别的风险,在这篇“回答文章”中
解决办法:
1. apt-get install -y gettext是一个标准的库,它包含的其中一个库是envsubst` `,我可以确认它对docker:apt-get install -y gettext是有效的,并且它应该适用于每个口味的版本。
2.依赖于“用例”的npm install envsub --基于节点的项目将更好地支持这种方法。
3. enstub cli project lib在我看来,从随机的陌生人那里下载自定义cli似乎有点过分了,但是,这也是另一种选择。
风险:
gettext --这种方法对于VM来说并不理想,因为任何软件包库都是如此,它需要随着时间的推移进行维护和更新。但是,对于docker来说,这并不是必需的,因为一旦一个容器被初始化、启动和运行,我们就可以创建一个bashscript来添加包,替换env,然后删除包。
2.)这对VM来说是个坏主意,因为它可以用来执行任意代码envsub --如果您处理的是不同的堆栈而不是使用nodejs,那么更新包和这种方法就不太理想了。注意到:对于那些开发PHP应用程序的人来说,它也有一个PHP版本,如果您需要一个自定义环境,它似乎可以使用PHP。
资源:
发布于 2017-03-01 02:29:30
我建议您使用Node,使用npm envsub模块。
这个模块经过了很好的测试,并且开发时考虑到了码头。
当您已经拥有完整的节点库时,它避免了依赖其他依赖项的需要。
envsub被描述为
envsub是NodeJS的envsubst NodeJS全局CLI模块通过工具栏提供文件级环境变量替换。
我是这个包裹的作者。我想你会喜欢的。
https://stackoverflow.com/questions/33548530
复制相似问题