Docker 主机的 Elastic Beanstalk 环境变量
Elastic Beanstalk environment variables for Docker host
我有一个正确部署了 Docker 网络应用程序 (rails) 的 EB 环境。我设置了几个 EB 环境变量,它们在容器中正确可见。现在 - 我希望这些 EB 环境变量对 EC2 实例主机可见,以便我可以在 docker 构建过程中使用它们。但是,它们不会暴露给 docker 主机,只会暴露给容器。
如何向 Docker 主机公开 EB 环境变量?
这是一个问题,所以我将我的解决方案发布给遇到此问题的人。
Elastic Beanstalk Docker 实例不会向 docker 主机公开环境变量。它仅对 docker 容器执行此操作。
如果您想获取主机上的环境变量,它们位于 /opt/elasticbeanstalk/deploy/configuration/containerconfiguration
.
这是一个很大的 JSON 文件,方便地 违反了环境变量的 JSON 结构。
我写了一个小 ruby 脚本来解析它并从中提取环境变量:
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
.
我 运行 遇到了同样的问题,但需要环境变量在执行 post-部署 Bash 脚本期间可用。
自jq parser is available on the (current) Amazon Linux AMIs, I was able to acheive something similar using it to parse the JSON and then export the environment variables on the host (this is an excerpt from an 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
一线之王
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 的环境变量。
我还没有在所有版本的 Elasticbeanstalk 上测试过这个。但是至少在 64 位 Amazon Linux 2015.03 v2.0.1 运行 Multi-container Docker 1.6.2 (Generic) 上,有一种更好的方法可以从您的配置中获取 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'
添加到@Patrick H McJury 的回答。
以下是它在多容器 beantalk 环境中对我的工作方式 -
.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
NEW_RELIC_LICENSE_KEY
& APPNAME
变量必须在 beantalk 环境之前填充。
我有一个正确部署了 Docker 网络应用程序 (rails) 的 EB 环境。我设置了几个 EB 环境变量,它们在容器中正确可见。现在 - 我希望这些 EB 环境变量对 EC2 实例主机可见,以便我可以在 docker 构建过程中使用它们。但是,它们不会暴露给 docker 主机,只会暴露给容器。
如何向 Docker 主机公开 EB 环境变量?
这是一个问题,所以我将我的解决方案发布给遇到此问题的人。
Elastic Beanstalk Docker 实例不会向 docker 主机公开环境变量。它仅对 docker 容器执行此操作。
如果您想获取主机上的环境变量,它们位于 /opt/elasticbeanstalk/deploy/configuration/containerconfiguration
.
这是一个很大的 JSON 文件,方便地 违反了环境变量的 JSON 结构。
我写了一个小 ruby 脚本来解析它并从中提取环境变量:
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
.
我 运行 遇到了同样的问题,但需要环境变量在执行 post-部署 Bash 脚本期间可用。
自jq parser is available on the (current) Amazon Linux AMIs, I was able to acheive something similar using it to parse the JSON and then export the environment variables on the host (this is an excerpt from an 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
一线之王
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 的环境变量。
我还没有在所有版本的 Elasticbeanstalk 上测试过这个。但是至少在 64 位 Amazon Linux 2015.03 v2.0.1 运行 Multi-container Docker 1.6.2 (Generic) 上,有一种更好的方法可以从您的配置中获取 envars。实例上已经有一个 ruby 脚本,它提供了 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'
添加到@Patrick H McJury 的回答。
以下是它在多容器 beantalk 环境中对我的工作方式 -
.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
NEW_RELIC_LICENSE_KEY
& APPNAME
变量必须在 beantalk 环境之前填充。