如何为弹性beanstalk docker容器设置每实例env变量?

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运行脚本,因为它们没有文档,似乎在没有通知的情况下发生变化.

Edw*_*uel 8

不幸的是,此时此刻,如果使用AWS特定内容或修改EB脚本/部署过程使您的应用程序混乱,您就无法做到您想要的事情.

选项#1:从您的应用中检查AWS元数据

您可以直接从Docker容器直接curl访问AWS Metadata(http://169.254.169.254/latest/meta-data/instance-id).

在Elastic Beanstalk Docker容器中运行<code>EC2_INSTANCE_ID</code>(或您想要的任何内容),只需调用AWS元数据服务即可获取实例ID.仅供参考,169.254.0.0/16是<a rel=本地链接地址.您还可以检测您的应用是否在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.shdocker build执行pre/03build.sh.因此,我们需要添加一个新脚本来注入ENV脚本文件名称顺序是01unzip.sh之前和之后03build.sh.正如你所说,这是无证的,可能会改变.但是,我想,如果你使用相同的Elastic Beanstalk平台版本,就不应该改变它.在升级生产环境之前,您需要验证此"hack"是否可以在下一个平台版本中运行.

实际上,还有其他一些选项可以将实例id设置为环境变量.如:修改docker runenact/00run.sh.我也不喜欢修改EB脚本.