我想使用运行命令的结果设置一个带ENV
的变量。
在bash中就像MY_VAR =`command \但是我无法让它在Docker中运行。
ENV MY_VAR =`command`将在命令中抛出错误,RUN导出MY_VAR ='command'也不起作用。
我在调用docker时知道it's possible to pass these variable values from the command line但是我没有调用docker而是调用第三方工具,所以我必须将它全部保存在Dockerfile
中。
编辑:
这就是我要导出的内容
ENV IOJS_VERSION =`curl -s -L https://iojs.org/dist | sed -n -r's / ^。(v([0-9]。?)+)。 $ / \ 1 / p'| sort -r |头-1`
答案 0 :(得分:0)
(真正的解决方案在最后一段。所有其他的事情只是为了回答你当前的问题。这是关于潜在问题的次优解决方案。)
一个肮脏的技巧是使用文件存储而不是环境。 来自Dockerfile的相关代码用于我的用例(找出最新的chromedriver版本,并下载它):
RUN wget http://chromedriver.storage.googleapis.com/$(</tmp/CHROMEDRIVER_VERSION)/chromedriver_linux64.zip
RUN bash -c 'echo chromedriver version is $(</tmp/CHROMEDRIVER_VERSION)'
RUN bash -c 'wget -q --continue -P $CHROMEDRIVER_DIR "http://chromedriver.storage.googleapis.com/$(</tmp/CHROMEDRIVER_VERSION)/chromedriver_linux64.zip"'
注意使用bash -c和单个tick(')。这是必需的,因为我在这里使用了一种玄力。可能就是这样
cat /tmp/CHROMEDRIVER_VERSION
没有bash -c也可以。我没有测试过这个。
另请注意,Docker无法检测到实际更改了chromedriver版本的时间,它可以随时从缓存中构建上述行。您可以在手动构建时使用--no-cache选项来克服这个问题并增加构建时间,但我不知道如何使用docker hub实现此目的。
解决我们的用例的正确方法可能是设置一个监视依赖版本的定期构建,并在更改时提交新版本的Dockerfile。它可以反过来触发docker hub构建。 此解决方案也更好,因为您可以按照分支策略的行开始测试闪亮的新docker镜像,因此您不会突然出现各种破坏,因为新的依赖关系会破坏您的系统。通过这种方式,您仍然可以使用最新的非破坏版本,并且当依赖性上升时会收到通知。