【问题标题】:Elastic Beanstalk environment variables for Docker hostDocker 主机的 Elastic Beanstalk 环境变量
【发布时间】:2015-04-02 14:25:23
【问题描述】:

我有一个正确部署了 Docker Web 应用程序 (rails) 的 EB 环境。我设置了几个 EB 环境变量,它们在容器中正确可见。现在 - 我希望这些 EB 环境变量对 EC2 实例主机可见,以便我可以在 docker 构建过程中使用它们。但是,它们不会暴露给 docker 主机,只会暴露给容器。
如何将 EB 环境变量暴露给 Docker 主机?

【问题讨论】:

    标签: docker amazon-elastic-beanstalk dockerfile


    【解决方案1】:

    我遇到了同样的问题,但在执行部署后的 Bash 脚本期间需要环境变量可用。

    由于jq parser 在(当前)Amazon Linux AMI 上可用,我能够使用它来解析 JSON,然后在主机上导出环境变量(这是 @987654322 的摘录) @):

    files:
      "/opt/elasticbeanstalk/hooks/appdeploy/post/export_env_vars_on_host.sh":
      mode: "000755"
      owner: root
      group: root
      content: |
        #!/usr/bin/env bash
        echo Defaults:root \!requiretty >> /etc/sudoers
        for envvar in `jq '.optionsettings | {"aws:elasticbeanstalk:application:environment"}[] | .[]' /opt/elasticbeanstalk/deploy/configuration/containerconfiguration`
        do
          temp="${envvar#\"}";
          temp="${temp/=/=\"}";
          export temp;
        done
    

    【讨论】:

    • 我遇到了这个问题,使用了一段时间。如果您有一个带有空格的环境变量,它将不起作用。例如。 TEST_VAR="x y z"。有没有简单的解决方法?
    • 我认为您必须在 for 循环之前添加 IFS=$'\n'。所以for循环不使用空格作为分隔符。
    【解决方案2】:

    这是一个问题,所以我将我的解决方案发布给遇到这个问题的人。
    Elastic Beanstalk Docker 实例不会向 docker 主机公开环境变量。它仅对 docker 容器执行此操作。
    如果您想获取主机上的环境变量,它们位于/opt/elasticbeanstalk/deploy/configuration/containerconfiguration
    这是一个大型 JSON 文件,很方便违反了环境变量的 JSON 结构。
    我写了一个小的 ruby​​ 脚本来解析它并从中提取环境变量:

    require 'json'
    container_config = JSON.parse(File.read('/opt/elasticbeanstalk/deploy/configuration/containerconfiguration'))
    raw_vars =  container_config['optionsettings']['aws:elasticbeanstalk:application:environment']
    envs = ''
    raw_vars.each do |raw_var|
      pair = raw_var.split('=')
      envs << "export #{pair[0]}=#{pair[1]}\n" if pair[1]
    end
    puts envs
    

    此脚本生成一组导出命令到设置环境变量的控制台。我对其进行了一些调整,将ENV 命令写入我的Dockerfile

    【讨论】:

    • 您能分享一下您是如何设法将它们作为 Dockerfile 中的 ENV 命令获取的吗?
    • @GlendGjermeni 您将 ENV 变量设置为弹性 beanstalk 环境变量(我是从 Web 控制台手动完成的)。这些被传播到 docker 容器。这是与使用 Dockerfile 不同的方法。
    【解决方案3】:

    我尚未在所有版本的 Elasticbeanstalk 上对此进行测试。但是在运行多容器 Docker 1.6.2(通用)的至少 64 位 Amazon Linux 2015.03 v2.0.1 上,有一种更好的方法可以从您的配置中获取 envar。实例上已经有一个 ruby​​ 脚本,它提供了 envars { "SOME_ENV_VAT" : "VALUE" }

    的正确 json 表示
    # returns literal null from jq
    sudo /opt/elasticbeanstalk/bin/get-config environment | jq -r '.MY_ENVVAR'
    
    # returns empty string. Usefull for bash -z
    sudo /opt/elasticbeanstalk/bin/get-config environment | jq -r '.MY_ENVVAR // empty'
    

    【讨论】:

      【解决方案4】:

      单排之王。

      eval $(sudo ruby -e 'require "json"; container_config = JSON.parse(File.read("/opt/elasticbeanstalk/deploy/configuration/containerconfiguration")); raw_vars = container_config["optionsettings"]["aws:elasticbeanstalk:application:environment"]; envs = ""; raw_vars.each do |raw_var| envs << "export #{raw_var};\n" end; print envs;')
      

      这将自动导出所有变量。 Ruby 中不能使用puts 输出环境变量。

      【讨论】:

        【解决方案5】:

        添加到@Patrick H McJury 的答案。

        这是它在多容器 beantalk 环境中对我的工作方式 -

        .ebextensions/newrelic.config -

        container_commands:
          setup-nr-infra:
            command: |
              NRIA_LICENSE_KEY=$(sudo /opt/elasticbeanstalk/bin/get-config environment | jq -r '.NEW_RELIC_LICENSE_KEY')
              NRIA_DISPLAY_NAME=$(sudo /opt/elasticbeanstalk/bin/get-config environment | jq -r '.APPNAME')
              touch /etc/newrelic-infra.yml && \
              echo "license_key: ${NRIA_LICENSE_KEY}" > /etc/newrelic-infra.yml && \
              echo "display_name: ${NRIA_DISPLAY_NAME}" >> /etc/newrelic-infra.yml && \
              chmod 644 /etc/newrelic-infra.yml
              sudo initctl start newrelic-infra || true
        
        commands:
        # Create the agent’s yum repository
          "01-agent-repository":
            command: sudo curl -o /etc/yum.repos.d/newrelic-infra.repo https://download.newrelic.com/infrastructure_agent/linux/yum/el/6/x86_64/newrelic-infra.repo
        #
        # Update your yum cache
          "02-update-yum-cache":
            command: yum -q makecache -y --disablerepo='*' --enablerepo='newrelic-infra'
        #
        # Run the installation script
          "03-run-installation-script":
            command: sudo yum install newrelic-infra -y
        

        NEW_RELIC_LICENSE_KEY & APPNAME 变量必须在 beanstalk 环境之前填充。

        【讨论】:

          猜你喜欢
          • 2015-08-05
          • 2017-12-26
          • 2020-11-09
          • 2017-07-24
          • 2015-06-08
          • 2016-12-10
          • 2020-08-26
          • 2020-06-02
          相关资源
          最近更新 更多