Эластичные переменные среды Beanstalk для хоста Docker

У меня есть EB env с веб-приложением Docker (рельсы), которые были правильно развернуты. Я установил несколько переменных EB env, и они хорошо видны в контейнере. Теперь - я бы хотел, чтобы эти переменные EB env были видимыми для экземпляра экземпляра EC2, поэтому я могу использовать их в процессе сборки докеров. Тем не менее, они не подвергаются действию хозяина докера, только для контейнера.
Как выставить переменные EB env на хост Docker?

Ответ 1

Это был один, поэтому я отправляю свое решение для тех, кто сталкивается с этим.
Эластичный экземпляр Docker Beanstalk не выставляет переменные окружения на хост докера. Это делается только для контейнера докера.
Если вы хотите получить переменные env на хосте, они расположены в /opt/elasticbeanstalk/deploy/configuration/containerconfiguration.
Это один большой файл JSON, который удобно нарушает структуру JSON для env vars.
Я написал небольшой ruby ​​ script, чтобы разобрать его и извлечь из него env vars:

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

этот script дает набор команд экспорта для консоли, который устанавливает env vars. Я немного адаптировал его для написания команд ENV в моем Dockerfile.

Ответ 2

Я столкнулся с той же проблемой, но мне нужны переменные окружения, которые будут доступны во время выполнения после развертывания Bash script.

Поскольку jq parser доступен в (текущем) AMI Amazon Linux, я смог добиться чего-то подобного, используя его для анализа 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

Ответ 3

Я не тестировал это на всех версиях Elasticbeanstalk. Но, по крайней мере, на 64-битной версии Amazon Linux 2015.03 v2.0.1, работающей с Multi-container Docker 1.6.2 (Generic), есть лучший способ получить envars из вашего конфига. Там есть ruby ​​ script в экземпляре, который предоставляет правильное 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'

Ответ 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;')

Это автоматически экспортирует все переменные. Вы не можете использовать puts для вывода переменных среды с Ruby.

Ответ 5

Добавление к @Patrick H McJury ответа.

Вот как это работало для меня в среде с несколькими контейнерами -

.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 agents 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 должна быть заполнена ранее в среде APPNAME.