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