我的具体用例是我想组织一些有关运行容器的 EC2 实例的数据,并将 i 用作环境变量。我想在构建容器时执行此操作。
我希望能够在我的 Dockerfile 中执行类似 ENV VAR_NAME $(./script/that/gets/var)
之类的操作,但不出所料,这不起作用(您只需获取字符串$(./script...
).
我应该提一下,我知道 docker run --env...
会这样做,但我特别希望将它内置到容器中。
我是否遗漏了一些明显的东西?这甚至可能吗?
最佳答案
Docker v1.9 或更新版本
如果您使用的是 Docker v1.9 或更新版本,这可以通过对构建时间参数的支持来实现。 using the ARG statement 在 Dockerfile
中声明参数.
ARG REQUIRED_ARGUMENT
ARG OPTIONAL_ARGUMENT=default_value
当您稍后实际使用 docker build
构建镜像时,您可以通过标志 --build-arg
传递参数,如 docker docs 中所述。 .
$ docker build --build-arg REQUIRED_ARGUMENT=this-is-required .
请注意,不建议将构建时变量用于密码或 key 或凭据等 secret 。
此外,构建时变量可能有 great impact on caching .因此,Dockerfile 的构建应该非常小心,以便能够尽可能地利用缓存,从而加快构建过程。
编辑:从 leedm777:s answer 输入后添加了“比 v1.9 更新的 docker”部分。 .
Docker v1.9 之前的版本
如果您使用的是 1.9 之前的 Docker 版本,则无法使用 ARG
/--build-arg
方法。您无法在构建期间解析此类信息,因此您必须将它们作为参数传递给 docker run
命令。
Docker 图像将随着时间的推移保持一致,而容器可以调整并被视为“丢弃进程”。
- 更多信息 ENV
- 关于 dynamic builds 的 docker 讨论
解决此问题的旧方法是使用模板。这不是一个简洁的解决方案,但在当时是极少数可行的选择之一。 (灵感来自 this discussion )。
- 将所有动态数据保存在 json 或 yaml 文件中
- 创建一个 docker 文件"template",以后可以在其中展开动态
- 编写一个脚本,使用您熟悉的模板库从配置数据创建 Dockerfile
关于docker - 在 Docker 构建时创建动态环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711304/