在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之一。 (来自这个讨论的启示)。
- 将所有dynamic数据保存在json或yaml文件中
- 创build一个docker文件“模板”,以便在以后扩展dynamic
- 编写一个脚本,使用您熟悉的模板库从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