每个环境单独的 Dockerrun.aws.json

Rut*_*jer 5 amazon amazon-web-services elasticsearch docker amazon-elastic-beanstalk

对于一个项目,我在 AWS Elastic Beanstalk 中有两个环境:验收和生产。验收使用一个简单的 t2.nano 实例,而生产使用一个 t2.medium。

t2.nano 有 500 MB 的 RAM,而 t2.medium 有 4 GB。因此,我希望根据我要部署到的环境在我的 Dockerrun.aws.json 中分配不同的内存。这似乎是不可能的。

我试过的:

  1. 设置两个 Dockerrun.aws.json 文件:Dockerrun.aws.json.acceptanceDockerrun.aws.json.production.
  2. .ebextensions脚本中,调整/opt/elasticbeanstalk/hooks/appdeploy/pre/01unzip.sh脚本(使用sed),使其在解压源Dockerrun.aws.json.[env]文件Dockerrun.aws.json之后和循环遍历容器定义之前将正确的文件复制到。

这部分有效:

  • Dockerrun.aws.json文件确实被替换为特定于环境的文件。
  • 但是,在整个源Dockerrun.aws.json文件甚至被解压缩之前,定义就已经被处理了:我的源代码根目录中有一个后备文件,显然已经使用了那个文件。当我删除该文件时,eb deploy失败No ecs task definition (or empty definition file) found in environment

我可以做什么:

  • 不要只使用eb deploy自定义部署脚本,该脚本首先将Dockerrun.aws.json文件替换为特定于环境的文件,然后运行eb deploy

但是,如果可以选择坚持使用纯 EB CLI 而不是使用自定义脚本,那将是我的偏好。

编辑:拥有两个 Dockerrun 的主要目标是为每个容器分配不同的内存,并为每个环境加载自定义 PHP-FPM 配置(通过将特定于环境的目录与配置文件安装到/usr/local/etc/php-fpm.d),它们对子进程具有不同的设置.

nit*_*jri 0

有点晚了,但是任何想要将不同Dockerrun.aws.json文件部署到不同环境的人可能会发现这很有帮助。

正如OP已经发现的那样,定义需要在部署时定义。尝试使用 .ebextensions 在生命周期中为时已晚。

来自what I could doOP - 使用自定义脚本进行部署正是我们所做的。

具体来说,我们的 CI 运行命令包括:

  1. 替换容器定义内的图像标签。
  2. .ebextensions/将和复制Dockerrun.aws.worker.json => Dockerrun.aws.json到单独的文件夹中。
  3. 该单独的文件夹(总共 4 个文件)已被压缩。
  4. 最后使用部署eb deploy