gpt4 book ai didi

docker - 使用RUN的结果来设置变量

转载 作者:行者123 更新时间:2023-12-02 20:26:27 24 4
gpt4 key购买 nike

我想通过使用运行命令的结果来设置ENV的变量。

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

ENV MY_VAR =`command`将对该命令抛出错误,并且RUN export 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 | head -1`

最佳答案

(真正的解决方案在最后一个段落中。此处的所有其他内容只是为了回答您的紧迫问题。这是有关基础问题的次优解决方案。)

一个肮脏的技巧是使用文件而不是环境作为存储。
在我的用例中,来自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的情况下也可以工作。我没有测试。

还要注意,Docker无法检测到何时实际更改了chromedriver版本,它将随时高兴地从缓存中构建上述行。您可以在手动构建时使用--no-cache选项来克服此问题并增加构建时间,但是我不知道如何使用docker hub实现这一点。

解决我们的用例的正确方法可能是建立一个定期构建,该构建可监视依赖项版本,并在更改依赖项时提交新版本的Dockerfile。反过来,它可能会触发docker hub构建。
从某种意义上说,该解决方案也是更好的,因为您可以按照分支策略来驱动对 Shiny 的新docker镜像的测试,因此不会突然出现各种破损,因为新的依赖项会破坏您的系统。这样,您仍然可以享受最新的非破坏性版本,并且当破坏性依赖关系增加时,您会收到通知。

关于docker - 使用RUN的结果来设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32351418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com