Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何为弹性beanstalk docker容器设置每个实例的环境变量?_Amazon Web Services_Amazon Elastic Beanstalk - Fatal编程技术网

Amazon web services 如何为弹性beanstalk docker容器设置每个实例的环境变量?

Amazon web services 如何为弹性beanstalk docker容器设置每个实例的环境变量?,amazon-web-services,amazon-elastic-beanstalk,Amazon Web Services,Amazon Elastic Beanstalk,我们的弹性单容器beanstalk docker应用程序通过多个ec2实例以负载平衡的方式运行 我想将运行它的机器的ec2实例id作为环境变量传递给docker容器。 (我希望避免在容器内执行AWS特定的操作) 我想我需要在一个.ebextension配置文件中放入一些内容,在这个文件中,我执行一个curl来获取实例数据,然后将其设置到一个环境变量中,该变量将传递给docker容器 类似这样的情况(不起作用;不会导致EB错误,但容器中没有env var): 理想情况下,我希望避免对EB运行脚本进

我们的弹性单容器beanstalk docker应用程序通过多个ec2实例以负载平衡的方式运行

我想将运行它的机器的ec2实例id作为环境变量传递给docker容器。 (我希望避免在容器内执行AWS特定的操作)

我想我需要在一个.ebextension配置文件中放入一些内容,在这个文件中,我执行一个curl来获取实例数据,然后将其设置到一个环境变量中,该变量将传递给docker容器

类似这样的情况(不起作用;不会导致EB错误,但容器中没有env var):


理想情况下,我希望避免对EB运行脚本进行黑客攻击,因为它们没有文档记录,并且似乎会在未经通知的情况下进行更改。

不幸的是,在这一时刻,如果不使用AWS特定的内容或修改EB脚本/部署过程,您将无法完成您想要的事情

选项#1:检查应用程序中的AWS元数据

您可以直接从Docker容器中
curl
AWS元数据()

从您的应用程序中,如果没有环境名称
EC2_INSTANCE_ID
(或任何您想要的内容),只需调用AWS元数据服务即可获取实例ID。仅供参考,169.254.0.0/16是一个示例。你也可以

选项#2:使用环境变量注入Dockerfile

Dockerfile可以使用
ENV
关键字包含环境变量。我们可以使用
ENV
将新的环境变量注入Dockerfile。环境变量注入Docker文件必须在提取应用程序之后和生成Docker图像之前完成

注入Dockerfile可以通过添加应用前部署挂钩来完成。只需使用
.ebextensions
appdeploy/pre
中创建一个新文件:

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
为什么必须在appdeploy之前完成?或者我们可以只使用
容器\u命令

container\u命令将在应用程序部署之前执行。它看起来很有希望,但我们不能使用它。生成docker文件后(
docker build
)将执行
container\u命令。要在Dockerfile中使用环境变量,我们需要在运行
docker build
之前注入
ENV

看一看。以下是appdeploy钩子的文件结构:

[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平台版本,就不应该更改它。在升级生产环境之前,您需要验证此“黑客”可以在下一个平台版本中运行


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

Hi@Shorn,这对你的应用程序来说够了吗,还是有一些特定的要求?正如问题中所述,我希望避免在容器中做AWS特定的事情。它在AWS之外的其他上下文中运行。我希望将标识符(以及其他特定于实例的内容)作为依赖项/配置项推入,而不是将AWS依赖项放入容器中。好的,抱歉。我没有清楚“AWS容器内的特定物品”。如果你想要完全一样(不修改你的应用程序或电子商务部署流程),我想,你的问题没有答案。我将使用你的选项2。是的,它可能会停止未来解决方案堆栈升级的工作,但我对此无能为力。直接从您的代码片段中复制/粘贴,看起来效果不错-谢谢。
[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