【问题标题】:Define environment variable in Dockerfile or docker-compose?在 Dockerfile 或 docker-compose 中定义环境变量?
【发布时间】:2019-12-18 15:26:11
【问题描述】:

阅读config point of the 12 factor app 后,我决定用环境变量覆盖包含默认值的配置文件。

我有 3 个Dockerfiles,一个用于 API,一个用于前端,一个用于工作人员。我有一个 docker-compose.yml 来运行这 3 个服务和一个数据库。

现在我想知道是否应该在 Dockerfiles 或 docker-compose.yml 中定义环境变量?使用一个而不是另一个有什么区别?

【问题讨论】:

    标签: docker docker-compose environment-variables dockerfile 12factor


    【解决方案1】:

    this:

    您可以使用“环境”键在服务的容器中设置环境变量,就像使用 docker run -e VARIABLE=VALUE ...

    另外,您可以在 dockerfile 中使用ENV 来定义环境变量。

    区别在于:

    Dockerfile 中定义的环境变量不仅会在docker build 中使用,它还会持久化到容器中。这意味着如果您在docker run 时没有设置-e,它仍然具有与Dockerfile 中定义的环境变量相同的环境变量。

    docker-compose.yaml 中定义的环境变量仅用于docker run

    也许下一个例子可以让你更清楚地理解:

    Dockerfile

    FROM alpine
    ENV http_proxy http://123
    

    docker-compose.yaml:

    app:
      environment:
        - http_proxy=http://123
    

    如果您在Dockerfile 中定义环境变量,则使用此映像的所有容器也将http_proxy 作为http://123。但实际情况可能是在你构建镜像的时候,你需要这个代理。但是,该容器可能由其他人运行,可能不需要此代理或仅具有另一个 http_proxy,因此他们必须删除入口点中的 http_proxy 或更改为 docker-compose.yaml 中的另一个值。

    如果你在docker-compose.yaml中定义了环境变量,那么用户在做docker-compose up时可以选择自己的http_proxy,如果用户没有配置docker-compose.yamlhttp_proxy将不会被设置。

    【讨论】:

    • 谢谢,我可以在 Dockerfile 中定义它,如果我理解正确的话,可以在 docker-compose.yml 中覆盖它
    • 是的,在Dockerfile 中定义不仅会影响docker build,还会影响docker run,在docker-compose 中定义可以覆盖docker run
    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2022-06-10
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多