簡體   English   中英

Docker主機的Elastic Beanstalk環境變量

[英]Elastic Beanstalk environment variables for Docker host

我有一個正確部署Docker web app(rails)的EB env。 我設置了幾個EB env變量,它們在容器中可以正常顯示。 現在 - 我希望這些EB env變量對EC2實例主機可見,以便我可以在docker構建過程中使用它們。 但是,它們不會暴露給docker主機,只會暴露給容器。
如何將EB env變量公開給Docker主機?

我遇到了同樣的問題,但需要在執行部署后Bash腳本期間提供環境變量。

由於jq解析器在(當前)Amazon Linux AMI上可用,我能夠使用它來解析JSON,然后在主機上導出環境變量(這是ebextensions配置文件的摘錄):

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

這只是一個,所以我為那些遇到這個的人發布我的解決方案。
Elastic Beanstalk Docker實例不會將環境變量公開給docker主機。 它只對docker容器執行此操作。
如果您想在主機上獲取env變量,它們位於/opt/elasticbeanstalk/deploy/configuration/containerconfiguration
這是一個大型JSON文件, 方便地違反了env變量的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

我沒有在所有版本的Elasticbeanstalk上測試過這個。 但至少運行多容器Docker 1.6.2(Generic)的64位Amazon Linux 2015.03 v2.0.1,有一種更好的方法可以從你的配置中獲取envars。 實例上有一個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'

一個國王的襯里。

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的環境變量。

加入@Patrick H McJury的回答。

以下是它在多容器beanstalk環境中對我有用的方法 -

.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

必須在beanstalk環境中填充NEW_RELIC_LICENSE_KEYAPPNAME變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM