我们的弹性单容器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`
理想情况下,我想避免攻击EB运行脚本,因为它们没有文档,似乎在没有通知的情况下发生变化。
答案 0 :(得分:8)
不幸的是,此时此刻,您无法执行您想要的操作而不会使用AWS特定内容混乱您的应用程序或修改EB脚本/部署过程。
选项#1:从您的应用中检查AWS元数据
您可以直接从Docker容器直接curl
AWS元数据(http://169.254.169.254/latest/meta-data/instance-id)。
在您的应用中,如果没有环境名称EC2_INSTANCE_ID
(或您想要的任何内容),只需调用AWS元数据服务即可获取实例ID。仅供参考,169.254.0.0 / 16是link-local address。您还可以detect your app is in AWS or not。
选项#2:使用环境变量注入Dockerfile
Dockerfile可以使用ENV
关键字包含环境变量。我们可以使用ENV
将新的环境变量注入Dockerfile。必须在提取应用程序之后和构建Docker镜像之前注入Dockerfile的环境变量。
注入Dockerfile可以通过添加pre-app-deployment hook 来完成。只需使用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
为什么必须在pre-appdeploy中完成?或者我们可以使用container_commands
吗?
container_commands
将在部署应用之前执行,因为documentation表示。看起来很有希望,但我们无法使用它。构建Dockerfile(container_commands
)后将执行docker build
。要在Dockerfile中使用环境变量,我们需要在运行ENV
之前注入docker build
。
查看Elastic Beanstalk: Under the Hood。这是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
应用程序文件在pre/01unzip.sh
中提取,docker build
在pre/03build.sh
中执行。因此,我们需要添加一个新脚本来注入ENV
,脚本文件名顺序在01unzip.sh
之后和03build.sh
之前。正如你所说,这是无证的,可能会改变。但是,我想,如果你使用相同的Elastic Beanstalk平台版本,就不应该改变它。你需要验证这个" hack"可以在升级生产环境之前在下一个平台版本中运行。
实际上,还有其他一些选项可以将实例ID设置为环境变量。例如:修改docker run
中的enact/00run.sh
行。我也不喜欢修改EB脚本。