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

时间:2015-09-08 05:15:33

标签: amazon-web-services 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`

理想情况下,我想避免攻击EB运行脚本,因为它们没有文档,似乎在没有通知的情况下发生变化。

1 个答案:

答案 0 :(得分:8)

不幸的是,此时此刻,您无法执行您想要的操作而不会使用AWS特定内容混乱您的应用程序或修改EB脚本/部署过程。

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

您可以直接从Docker容器直接curl AWS元数据(http://169.254.169.254/latest/meta-data/instance-id)。

Run <code>curl -s http://169.254.169.254/latest/meta-data/instance-id</code> inside Elastic Beanstalk Docker container

在您的应用中,如果没有环境名称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 buildpre/03build.sh中执行。因此,我们需要添加一个新脚本来注入ENV,脚本文件名顺序在01unzip.sh之后和03build.sh之前。正如你所说,这是无证的,可能会改变。但是,我想,如果你使用相同的Elastic Beanstalk平台版本,就不应该改变它。你需要验证这个&#34; hack&#34;可以在升级生产环境之前在下一个平台版本中运行。

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