9

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

ответ

5

Это было хотя одно, поэтому я отправляю свое решение для тех, кто сталкивается с этим.
Эластичный экземпляр Docker Beanstalk не выставляет переменные окружения на хост докера. Он делает это только для контейнера докера.
Если вы хотите получить переменные env на хосте, они расположены по адресу /opt/elasticbeanstalk/deploy/configuration/containerconfiguration.
Это один большой файл JSON, удобно не подчиняется структуре JSON для 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 

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

+0

Не могли бы вы поделиться, как вам удалось получить их как команды ENV внутри Dockerfile? –

+0

@GlendGjermeni вы устанавливаете переменные ENV как переменные среды эластичного beanstalk (я сделал это с веб-консоли вручную). Они распространяются в контейнер докера. Это другой подход, чем использование файла Docker. – Tal

8

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

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

У меня возникла проблема с этим, использовав это некоторое время. Если у вас есть переменная среды с пробелом внутри, она не будет работать. Например. TEST_VAR = "x y z". Есть ли легкое решение для этого? –

+1

Я понял, что вы должны добавить 'IFS = $ '\ n'' перед циклом for. Таким образом, для цикла не используется пространство как разделитель. –

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.

5

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

 Смежные вопросы

  • Нет связанных вопросов^_^