【问题标题】:Create dynamic environment variables at build time in Docker在 Docker 构建时创建动态环境变量
【发布时间】:2014-12-30 19:24:40
【问题描述】:

我的具体用例是我想组织一些关于运行容器的 EC2 实例的数据,并将 i 用作环境变量。我想在构建容器时执行此操作。

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

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

我是否遗漏了一些明显的东西?这甚至可能吗?

【问题讨论】:

  • 您希望./script/that/gets/var 何时运行? Docker 文件用于构建时间。如果你想在容器启动时运行一些东西,只需创建一个运行 ./script/that/gets/var 的脚本,然后是主命令。
  • 我希望它在构建时运行并创建将在运行时出现的环境变量。

标签: docker


【解决方案1】:

要将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

【讨论】:

    【解决方案2】:

    Docker v1.9 或更新版本

    如果您使用的是 Docker v1.9 或更新版本,这可以通过对构建时间参数的支持来实现。参数由using the ARG statementDockerfile 中声明。

    ARG REQUIRED_ARGUMENT
    ARG OPTIONAL_ARGUMENT=default_value
    

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

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

    请注意,建议将构建时变量用于密码或密钥或凭据等机密。

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

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


    Docker v1.9 之前的版本

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

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

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

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

    【讨论】:

    • 回复:“docker 图像的目的是非常一致的”,我明白了,但这是专门针对容器的,它有各种动态的东西。
    • 我的用例的模板方法的问题是应用程序在 Elastic Beanstalk 上运行并且构建步骤由服务控制,因此我无法在我真正关心的地方编译模板关于它(尽管它肯定会解决其他用例的这个问题)。
    • @Evan 听到了,棘手的问题。那么答案是:不——你没有遗漏任何明显的东西,而且这是不可能的;)
    • 好吧,至少我可以在发布之前对我的研究感觉良好 :) 在这里,打勾。
    【解决方案3】:

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

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

    【讨论】:

    • 附带问题......这是如何传递给弹性豆茎的构建的? AFAIK,您无法向 Elastic Beanstalk 上的 docker 部署提供构建命令。
    猜你喜欢
    • 2019-02-25
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多