对于一个项目,我在AWS Elastic Beanstalk中有两个环境:验收和生产。验收使用简单的t2.nano实例,而生产使用t2.mediam.
t2.nano有500 MB的RAM,而t2.medium有4 GB。因此,我希望在我的Dockerrun.aws.json中有不同的内存分配,这取决于我部署到的环境。这似乎是不可能的。
我尝试过的:
- 设置两个Dockerrun.aws.json文件:
Dockerrun.aws.json.acceptance
和Dockerrun.aws.json.production
- 在
.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运行命令:
- 替换容器定义中的图像标记
- 将
.ebextensions/
和Dockerrun.aws.worker.json => Dockerrun.aws.json
复制到一个单独的文件夹中 - 这个单独的文件夹(总共4个文件(是压缩的
- 最后使用CCD_ 20进行部署