Sho*_*orn 3 amazon-web-services amazon-elastic-beanstalk
我们的弹性单容器beanstalk docker应用程序在与多个ec2实例进行负载平衡时运行.
我想将它运行的机器的ec2实例id作为环境变量传递给docker容器.(我想避免在容器内部执行AWS特定的东西).
我想我需要在.ebextension配置文件中放置一些东西,在那里我做一个curl来获取实例数据,然后将它设置为一个环境变量,它将被传递给docker容器.
像这样的东西(它不起作用;它不会导致EB错误,但容器内的env var不可用):
container_commands:
set_instance_id:
command: export EC2_INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想避免黑客攻击EB运行脚本,因为它们没有文档,似乎在没有通知的情况下发生变化.
不幸的是,此时此刻,如果不使用AWS特定内容或修改EB脚本/部署过程使您的应用程序混乱,您就无法做到您想要的事情.
选项#1:从您的应用中检查AWS元数据
您可以直接从Docker容器直接curl访问AWS Metadata(http://169.254.169.254/latest/meta-data/instance-id).
本地链接地址.您还可以检测您的应用是否在AWS中.
选项#2:使用环境变量注入Dockerfile
Dockerfile可以使用ENV关键字包含环境变量.我们可以ENV在您的Dockerfile中注入一个新的环境变量.必须在提取应用程序之后和构建Docker镜像之前注入Dockerfile的环境变量.
注入Dockerfile可以通过添加pre-app-deployment钩子来完成.只需在appdeploy/pre使用中创建一个新文件.ebextensions:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/02injectdockerfile.sh":
mode: "000755"
content: |
. /opt/elasticbeanstalk/hooks/common.sh
EB_CONFIG_APP_CURRENT=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
cd $EB_CONFIG_APP_CURRENT
echo "ENV EC2_INSTANCE_ID \"`curl -s http://169.254.169.254/latest/meta-data/instance-id`\"" >> Dockerfile
Run Code Online (Sandbox Code Playgroud)
为什么必须在预应用程序中完成?或者我们可以使用container_commands?
这container_commands将在应用程序部署之前执行,因为文档说明了这一点.它看起来很有希望,但我们不能使用它.在container_commands该Dockerfile建成后,将执行(docker build).要在Dockerfile中使用环境变量,我们需要ENV在运行之前注入docker build.
看看Elastic Beanstalk:在胡德之下.这是appdeploy hook的文件结构:
[ec2-user@ip-172-31-62-137 ~]$ tree /opt/elasticbeanstalk/hooks/appdeploy/
/opt/elasticbeanstalk/hooks/appdeploy/
??? enact
? ??? 00run.sh
? ??? 01flip.sh
??? post
? ??? 01_monitor_pids.sh
??? pre
??? 00clean_dir.sh
??? 01unzip.sh
??? 02docker_db_check.sh
??? 03build.sh
Run Code Online (Sandbox Code Playgroud)
应用程序文件被提取pre/01unzip.sh并docker build执行pre/03build.sh.因此,我们需要添加一个新脚本来注入ENV脚本文件名称顺序是01unzip.sh之前和之后03build.sh.正如你所说,这是无证的,可能会改变.但是,我想,如果你使用相同的Elastic Beanstalk平台版本,就不应该改变它.在升级生产环境之前,您需要验证此"hack"是否可以在下一个平台版本中运行.
实际上,还有其他一些选项可以将实例id设置为环境变量.如:修改docker run行enact/00run.sh.我也不喜欢修改EB脚本.
| 归档时间: |
|
| 查看次数: |
2171 次 |
| 最近记录: |