我的具体用例是,我想组织一些关于运行容器的EC2实例的数据,并将其作为环境变量提供。我想在容器建好时这样做。
我希望能够在我的Dockerfile中执行类似ENV VAR_NAME $(./script/that/gets/var)
的操作,但不出所料这不起作用(您只需获取字符串$(./script...
)。
我应该提一下,我知道docker run --env...
会做到这一点,但我特别希望将它构建到容器中。
我错过了一些明显的东西吗?这甚至可能吗?
答案 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 :(得分:31)
Docker 1.9 has added support for build time arguments。
在Dockerfile
,add an ARG
statement,其语法与ENV
类似。
ARG FOO_REQUIRED
ARG BAR_OPTIONAL=something
在构建时,您可以传递pass a --build-arg
argument来设置该构建的参数。 1}}中未指定默认值的任何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