在Docker中构build时创builddynamic环境variables

我的具体用例是,我想组织一些关于运行容器的EC2实例的数据,并将其作为一个环境variables提供。 我想在容器build好的时候这样做。

我希望能够在我的Dockerfile中执行像ENV VAR_NAME $(./script/that/gets/var)这样的操作,但毫不奇怪的是这样做不起作用(只是得到string$(./script... )。

我应该提到,我知道docker run --env...会做到这一点,但我特别希望它被build成容器。

我错过了什么明显的? 这甚至有可能吗?

Docker v1.9或更新版本

如果您使用的是Docker v1.9或更新版本,则可以通过支持构build时间参数来实现。 通过使用ARG语句在Dockerfile中声明参数。

 ARG REQUIRED_ARGUMENT ARG OPTIONAL_ARGUMENT=default_value 

当你以后实际上使用docker build来构build你的图像时,你可以通过docker文档中所描述的标志--build-arg来传递参数。

 $ docker build --build-arg REQUIRED_ARGUMENT=this-is-required . 

请注意, build议使用构build时variables来获取密码或秘密,如密钥或凭证。

而且,构build时variables可能对caching有很大的影响 。 因此,Dockerfile应该非常小心地构build,以尽可能地利用caching,并加快构build过程。

编辑:“docker工具比v1.9更新” – 部分是在inputleedm777:s的答案后添加的 。


Docker在v1.9之前

如果您在1.9之前使用Docker版本,那么ARG / --build-arg方法是不可能的。 在构build期间你不能解决这种信息,所以你必须把它们作为parameter passing给docker run命令。

Docker 镜像随着时间的推移将保持一致,而容器可以被调整,并被视为“抛弃过程”。

  • 有关ENV的更多信息
  • 关于dynamic构build的 docker讨论

这个问题的旧解决scheme是使用模板。 这不是一个整洁的解决scheme,但是当时很less有可行的select之一。 (来自这个讨论的启示)。

  1. 将所有dynamic数据保存在json或yaml文件中
  2. 创build一个docker文件“模板”,以便在以后扩展dynamic
  3. 编写一个脚本,使用您熟悉的模板库从configuration数据创build一个Dockerfile

Docker 1.9 增加了对构build时间参数的支持 。

在您的Dockerfile , 添加一个ARG语句 ,其语法与ENV类似。

 ARG FOO_REQUIRED ARG BAR_OPTIONAL=something 

在构build时,可以传递一个--build-arg参数来为该构build设置参数。 必须指定在Dockerfile没有赋予默认值的任何ARG

 $ docker build --build-arg FOO_REQUIRED=best-foo-ever . 

要将ENV VAR_NAME $(./script/that/gets/var)构build到容器中,请在构build时创build一个dynamicDockerfile:

 $ docker build -t awesome -f Dockerfile . $ # get VAR_NAME value: $ VAR_VALUE=`docker run --rm awesome \ bash -c 'echo $(./script/that/gets/var)'` $ # use dynamic Dockerfile: $ { echo "FROM awesome" echo "ENV VAR_NAME $VAR_VALUE" } | docker build -t awesome - 

https://github.com/42ua/docker-autobuild/blob/master/emscripten-sdk/README.md#build-docker-image