每个环境单独使用Dockerrun.aws.json



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

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(,这些目录具有不同的子进程设置。

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

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

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

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

  1. 替换容器定义中的图像标记
  2. .ebextensions/Dockerrun.aws.worker.json => Dockerrun.aws.json复制到一个单独的文件夹中
  3. 这个单独的文件夹(总共4个文件(是压缩的
  4. 最后使用CCD_ 20进行部署

最新更新