使用RUN的结果来设置一个variables

我想使用运行一个命令的结果与ENV设置一个variables。

在bash中就像MY_VAR =`command \,但是我不能在Docker中工作。

ENV MY_VAR =`command`会在命令中输出一个错误,RUN输出MY_VAR ='command'也不起作用。

我知道有可能在调用docker时从命令行传递这些variables值,但是我并没有调用docker,而是使用了第三方工具,所以我必须把它全部保存在Dockerfile

编辑:

这是我想出口

ENV IOJS_VERSION =`curl -s -L https://iojs.org/dist | sed -n -r's / ^。 (V([0-9]。?)+)。 $ / \ 1 / p'| sort -r | 头-1“

(真正的解决scheme在最后一段,所有其他的东西只是为了回答你的问题,哪一个是关于底层问题的次优解决scheme。

一个肮脏的窍门是使用文件的存储,而不是环境。 从我的用例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和单个刻度(')。 这些是需要的,因为我在这里使用bashism。 可能是cat /tmp/CHROMEDRIVER_VERSION也可以,不用bash -c。 我没有testing这个。

另外需要注意的是,Docker无法检测到chromedriver版本实际发生了什么变化,随时都可以从caching中愉快地创build上述行。 你可以在手动构build时使用–no-cache选项来克服这个问题,并且增加构build时间,但是我不知道如何用docker hub实现这个function。

解决我们的用例的正确方法可能是build立一个定期构build,监视依赖版本,并在更改时提交新版本的Dockerfile。 它可能反过来触发docker中心构build。 从这个意义上说,这个解决scheme也是更好的,因为你可以沿着分支策略的方向来testing你的shiny的新Docker镜像,所以你不会突然发生各种各样的破坏,因为新的依赖会破坏你的系统。 这样,您仍然可以享受到最新的非破坏版本的豪华享受,并且在破产依赖性上升时您会收到通知。