【问题标题】:How to build Docker with env file如何使用 env 文件构建 Docker
【发布时间】:2017-12-25 12:57:23
【问题描述】:

我在 docker build 期间遇到了 env 文件。

我正在尝试为我的 ruby​​ 项目构建 docker 映像,该项目使用环境变量有多种原因。 原因之一是检查数据库是否可用(使用ActiveRecord::Base.connection),并在此基础上使用一些主数据创建/更新数据库。

我可以在 docker run 期间通过docker run --env-file='.env' 命令使用 env 文件。

但我想在 docker 构建期间使用这些 ENV 变量。

谁能帮我解决这种情况?

【问题讨论】:

  • 我遇到了这个问题,没有优雅的解决方法。我希望 docker 在构建阶段提供这样的功能。

标签: ruby-on-rails activerecord docker-compose dockerfile


【解决方案1】:

您还可以使用--build-arg 设置构建环境变量。 documentation 上的示例

如你所见,它相当于docker run --env,没有--env-file

【讨论】:

    【解决方案2】:

    如果您使用的是 docker-compose(现在与 Docker 捆绑在一起),.env 是包含可供 解析器使用的变量的文件的默认文件名 strong> 仅适用于 docker-compose.yml 文件,不适用于构建过程或容器环境变量。

    使用--env-file 命令行参数或在您的docker-compose.yml 文件中设置env_file 变量将识别从哪个文件将变量加载到容器环境(而不是构建过程)。您可以从正在运行的容器中的 shell 运行 set 以查看已加载的环境变量。

    docker-compose.yml 中将 .env 分配给 env_file 是一种常见的反模式,这是一件非常令人困惑的事情,因为它使 .env 文件为 docker-compose.yml 解析器 和正在运行的容器环境提供两个变量 - 这几乎肯定是您阅读本文的原因。

    如果您希望 .env 中的变量可用于 构建过程,即您希望在 Dockerfile 中使用它们,那么你需要在 docker-compose.yml 中明确设置它们,并且你需要在 Dockerfile 中加载它们。此示例显示了在 .envdocker-compose.ymlDockerfile 中使用的语法:

    # This excerpt is from .env
    # ...
    # The quotes here are important if you have any special 
    # characters and want them to work on mac, pc and linux:
    ARG_1="value of first argument"
    ARG_2="value of second argument"
    ARG_3="value of third argument"
    # ...
    
    # This excerpt is from docker-compose.yml
    # ...
    # env_file (.env.staging) is loaded in the container at runtime:
        env_file:
          - .env.staging
    # ...
        build:
          context: ./
          dockerfile: docker/app/Dockerfile
    # The following will let you use ${ARG_x} during your build in docker/app/Dockerfile
          args:
            ARG_1: ${ARG_1}
            ARG_2: ${ARG_2}
            ARG_3: ${ARG_3}
    # ...
    
    # This excerpt is from /docker/app/Dockerfile
    FROM somerepo/someimage:ver as something
    # Import variables from docker-compose:
    ARG ARG_1=$ARG_1
    ARG ARG_2=$ARG_2
    ARG ARG_3=$ARG_3
    # ...
    # Now you can use ${ARG_1}, ${ARG_2} etc to reference values from your .env file
    # ...
    

    【讨论】:

      【解决方案3】:

      我遇到过需要在 sed 命令中添加一个变量的情况。我使用了以下内容:

      RUN source config.env; sed -i -r "s/^url=.*/url=${MONGODB_SERVER}/" /app/module/module.ini
      
      

      变量可用性仅限于该特定命令,但这对我来说已经足够了。

      【讨论】:

        【解决方案4】:

        您可以在 Dockerfile 中添加 ENV myvariable myvalue。 查看docker 文档。

        【讨论】:

        • 感谢您的回复。如果我遵循您建议的方法,那么我必须使用多个 ENV myvariable myvale 语句对吗?只需要确认,因为我有 5 到 6 个不同的 ENV 变量。有什么解决方法可以让我传递完整的 ENV 文件吗?
        • 是的,你必须使用多个 ENV。
        猜你喜欢
        • 2021-10-18
        • 2023-02-21
        • 2018-05-07
        • 2022-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-02
        相关资源
        最近更新 更多