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

Eva*_*van 40 docker

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

我希望能够ENV VAR_NAME $(./script/that/gets/var)在我的Dockerfile中做一些事情,但不出所料这不起作用(你只是得到字符串$(./script...).

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

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

lee*_*777 32

Docker 1.9 增加了对构建时参数的支持.

在你的Dockerfile,你添加一个ARG语句,它具有类似的语法ENV.

ARG FOO_REQUIRED
ARG BAR_OPTIONAL=something
Run Code Online (Sandbox Code Playgroud)

在构建时,您可以传递一个--build-arg参数来设置该构建的参数.必须指定任何ARG未给出默认值的内容Dockerfile.

$ docker build --build-arg FOO_REQUIRED=best-foo-ever .
Run Code Online (Sandbox Code Playgroud)

  • 侧面问题......这是如何传递到弹性beanstalk的构建?AFAIK您无法在Elastic Beanstalk上为docker部署提供构建命令. (4认同)

was*_*ren 31

Docker v1.9或更高版本

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

ARG REQUIRED_ARGUMENT
ARG OPTIONAL_ARGUMENT=default_value
Run Code Online (Sandbox Code Playgroud)

当您稍后使用时,docker build您可以通过标记传递参数--build-arg,如docker文档中所述.

$ docker build --build-arg REQUIRED_ARGUMENT=this-is-required .
Run Code Online (Sandbox Code Playgroud)

请注意,建议不要对密码或密钥(如密钥或凭据)使用构建时变量.

此外,构建时变量可能对缓存很大影响.因此,Dockerfile应该非常谨慎地构建,以便能够尽可能地利用缓存并加速构建过程.

编辑:从leedm777:s回答输入之后添加了"比v1.9更新的码头"-part .


在v1.9之前的Docker

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

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

这个问题的旧解决方案是使用模板.这不是一个简洁的解决方案,但却是当时极少数可行的选择之一.(这次讨论的启示).

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