Docker主机的Elastic Beanstalk环境变量

时间:2015-02-03 11:44:47

标签: docker elastic-beanstalk dockerfile amazon-elastic-beanstalk

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

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:6)

这只是一个,所以我会为那些遇到此问题的人发布我的解决方案 Elastic Beanstalk Docker实例不会将环境变量公开给docker主机。它只对停靠者容器这样做 如果您想在主机上获取env变量,则它们位于/opt/elasticbeanstalk/deploy/configuration/containerconfiguration 这是一个大的JSON文件,方便地违反了env vars的JSON结构。
我写了一个小的ruby脚本来解析它并从中提取env变种:

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变量。我稍微调整了一下,将ENV命令写入Dockerfile

答案 2 :(得分:5)

我还没有在所有版本的Elasticbeanstalk上测试过这个。但至少运行多容器Docker 1.6.2(Generic)的64位Amazon Linux 2015.03 v2.0.1,有一种更好的方法可以从配置中获取envars。已经在实例上有一个ruby脚本,它提供了适当的json表示envars { "SOME_ENV_VAT" : "VALUE" }

# 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'

答案 3 :(得分:2)

单人之王。

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;')

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

答案 4 :(得分:0)

在@Patrick H McJury的答案中添加。

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

.ebextensions / newrelic.config -

$retailers = ['HYD-48AC' => 'B001', 'PUN-48AC' => 'B002'];
array_walk($products, function(&$v, $k) use ($retailers){
  !empty($retailers[$v['retailer']]) ? ($v['batchid'] = $retailers[$v['retailer']]) : '';
});

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变量必须先在beantalk环境中填充。