envsubst命令卡在容器中

时间:2015-11-05 15:27:22

标签: docker environment-variables containers

我要求在应用程序运行之前,它的某些部分需要读取环境变量。为此,我有以下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容器中尝试了相同的命令,它可以工作。它只在我运行图像时不起作用

4 个答案:

答案 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