2014-12-30 70 views
34

我的具体使用案例是,我想组织有关运行容器的EC2实例的一些数据,并使其作为环境变量提供。我想在容器建成时这样做。在构建时在Docker中创建动态环境变量

我希望能够在我的Dockerfile中做类似ENV VAR_NAME $(./script/that/gets/var)的事情,但毫不奇怪,这是行不通的(你只是得到字符串$(./script...)。

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

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

+0

您想要什么时候运行'。/ script/that/gets/var'? Docker文件用于构建时间。如果你想在容器启动时运行一些东西,只需创建一个脚本,该脚本运行'./ script/that/gets/var',然后是主命令。 – generalhenry

+0

我希望它在构建时运行并创建将在运行时出现的环境变量。 – Evan

回答

28

泊坞V1.9以上版本

如果您使用的码头工人V1.9或更高版本,这对于通过构建时间参数的支持是可能的。参数Dockerfileusing 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,以尽可能地利用缓存,并在其中加速构建过程。

编辑:“docker比v1.9更新” - 部分是在leedm777:s answer输入后添加的。


泊坞V1.9

如果您之前1.9使用泊坞版本之前,该ARG/--build-arg的做法是不可能的。在构建过程中无法解析此类信息,因此您必须将它们作为参数传递给docker run命令。

Docker 图片随着时间的推移将保持一致,而容器可以被调整并被视为“丢弃过程”。

老办法解决这个问题是使用模板。这不是一个很好的解决方案,但是当时很少有可行的选择之一。 (来自this discussion的启示)。

  1. 保存在一个JSON或YAML文件
  2. 创建一个泊坞窗文件“模板”,其动态以后可以扩展
  3. 编写使用一些从配置数据创建一个Dockerfile脚本的所有动态数据模板库,你所熟悉的
+0

回复:“码头图像的目的是非常一致的”,我明白了,但这是专门关于容器,它有各种动态的东西。 – Evan

+0

我的用例模板方法的问题在于,应用程序在Elastic Beanstalk上运行,构建步骤由服务控制,因此我无法在我真正关心的地方编译我的模板(尽管它肯定会解决其他用例的这个问题)。 – Evan

+0

@Evan听到听到,棘手的问题。然后答案是:不 - 你没有错过任何明显的东西,这是不可能的;) – wassgren

30

码头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来设置该构建的参数。必须指定在Dockerfile中没有给出默认值的任何ARG

$ docker build --build-arg FOO_REQUIRED=best-foo-ever . 
+4

旁边的问题......这是如何传递到一个弹性beanstalk构建? AFAIK您无法向Elastic Beanstalk上的Docker部署提供构建命令。 – user1658296