在Docker中的构建时创建动态环境变量

时间:2014-12-30 19:24:41

标签: docker

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

我希望能够在我的Dockerfile中执行类似ENV VAR_NAME $(./script/that/gets/var)的操作,但不出所料这不起作用(您只需获取字符串$(./script...)。

我应该提一下,我知道docker run --env...会做到这一点,但我特别希望将它构建到容器中。

我错过了一些明显的东西吗?这甚至可能吗?

3 个答案:

答案 0 :(得分:31)

Docker v1.9或更新版

如果您使用的是Docker v1.9或更高版本,则可以通过支持构建时参数来实现。参数在Dockerfile中由using the ARG statement声明。

ARG REQUIRED_ARGUMENT
ARG OPTIONAL_ARGUMENT=default_value

当您稍后使用docker build实际构建图像时,您可以通过docker docs中所述的标记--build-arg传递参数。

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

请注意,建议使用构建时变量来保存密码或密码等密码。

此外,构建时变量可能有great impact on caching。因此,Dockerfile应该非常谨慎地构建,以便能够尽可能地利用缓存,并加快构建过程。

编辑:在leedm777:s answer的输入后添加了比v1.9" -part更新的"泊坞窗。


v1.9之前的Docker

如果您在1.9之前使用Docker版本,则无法使用ARG / --build-arg方法。在构建期间,您无法解析此类信息,因此您必须将它们作为参数传递给docker run命令。

Docker 图像随着时间的推移是一致的,而容器可以被调整并被视为"抛弃进程"。

这个问题的旧解决方案是使用模板。这不是一个简洁的解决方案,但是当时很少有可行的选择之一。 (来自this discussion的灵感)。

  1. 将所有动态数据保存在json或yaml文件中
  2. 创建一个泊坞文件"模板"以后可以扩展动态
  3. 编写一个脚本,使用您熟悉的一些模板库从配置数据创建Dockerfile

答案 1 :(得分:31)

Docker 1.9 has added support for build time arguments

Dockerfileadd an ARG statement,其语法与ENV类似。

ARG FOO_REQUIRED
ARG BAR_OPTIONAL=something

在构建时,您可以传递pass a --build-arg argument来设置该构建的参数。 ARG必须指定。

Dockerfile

答案 2 :(得分:3)

要将ENV VAR_NAME $(./script/that/gets/var)构建到容器中,请在构建时创建动态Dockerfile:

$ 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