我要求在应用程序运行之前,它的某些部分需要读取环境变量。为此,我有以下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容器中尝试了相同的命令,它可以工作。它只在我运行图像时不起作用
答案 0 :(得分:6)
这可能是因为$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
答案 1 :(得分:0)
我建议您使用Node,因此使用npm envsub模块。
这个模块经过了充分测试,并在开发时考虑了docker。
当您已经拥有完整的Node arsenal时,它可以避免依赖其他依赖项。
envsub被描述为
envsub是NodeJS的envsubst
NodeJS全局CLI模块,通过Handlebars提供文件级环境变量替换
我是该套餐的作者。我想你会喜欢它。
答案 2 :(得分:0)
经过大量研究和通过互联网钓鱼后,我遇到了同样的问题。我设法找到一些解决此问题的方法。在下面的“答案发布”时,我将列出它们和可识别的风险
解决方案:
1。)Install Plugin from Disk
是标准的GNU软件包语言库,它包含的这些库之一是envsubst`,我可以确认它适用于Docker UBUNTU:latest,并且它适用于所有调味版本。
2。)sp = new JScrollPane(lista);
sp.getVerticalScrollBar().setUI(new CustomScrollBarUI());
取决于“用例”-基于节点的项目将更好地支持这种方法。
3。)protected void paintTrack(Graphics g, JComponent c, Rectangle r) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Color color = ColorPri;
JScrollBar sb = (JScrollBar) c;
scrollBarWidth = 9;
if (!sb.isEnabled()) {
return;
} else if (isDragging) {
color = ColorSec;
}
g2.setColor(color);
g2.fillRect(r.x, r.y, r.width, r.height);
g2.setColor(color);
g2.fillRect(r.x, r.y, r.width, r.height);
}
@Override
protected void paintThumb(Graphics g, JComponent c, Rectangle r) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Color color = null;
JScrollBar sb = (JScrollBar) c;
if (!sb.isEnabled()) {
return;
} else if (isDragging) {
color = ColorPri;
} else if (isThumbRollover()) {
color = ColorSec;
} else {
color = ColorSec;
}
g2.setPaint(color);
g2.fillRoundRect(1, r.y, 7, r.height, 5, 5);
g2.dispose();
}
@Override
protected void setThumbBounds(int x, int y, int width, int height) {
super.setThumbBounds(x, y, width, height);
scrollbar.repaint();
}
}
在我看来,从随机的陌生人那里下载自定义cli似乎有点过头了,但这也是另一种选择。
风险:
apt-get install -y gettext:
1。)apt-get install -y gettext
-与任何程序包库一样,这种方法对于VM而言并不理想,它需要维护和随着时间的流逝而更新。但是,对于docker来说这不是必需的,因为一旦容器初始化并启动并运行,我们可以创建一个bashscript来添加软件包,替换为env vars,然后删除该软件包。
2。)对于VM而言,这是个坏主意,因为它可用于执行任意代码
npm install ensub
1。)npm install envsub
-更新软件包,如果您使用不同的堆栈而不使用nodejs,则此方法并不理想。
注意: 对于那些开发PHP应用程序的人来说,还有一个PHP版本,如果您需要自定义环境,它似乎可以运行PHP的CLI。
资源:
答案 3 :(得分:0)
我在 Docker 中遇到了 envsubst
的一些问题。
由于某些原因,当我尝试在同一文件中复制输出时 envsubst
不起作用。例如,这不起作用:
RUN envsubst < file.conf > file.conf
但是当我尝试使用临时文件时,问题就消失了:
RUN envsubst < file.conf > file.conf.temp && cp -f file.conf.temp file.conf