每个环境单独的 Dockerrun.aws.json
Posted
技术标签:
【中文标题】每个环境单独的 Dockerrun.aws.json【英文标题】:Separate Dockerrun.aws.json per environment 【发布时间】:2019-01-09 12:34:06 【问题描述】:对于一个项目,我在 AWS Elastic Beanstalk 中有两个环境:验收和生产。验收使用一个简单的 t2.nano 实例,而生产使用一个 t2.medium。
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
),这子进程有不同的设置。
【问题讨论】:
【参考方案1】:有点晚了,但是任何想要将不同的 Dockerrun.aws.json
文件部署到不同环境的人可能会发现这很有帮助。
正如 OP 已经发现的那样,需要在部署时定义定义。在生命周期中尝试使用 .ebextensions 为时已晚。
来自 OP 的 what I could do
- 使用自定义脚本进行部署正是我们所做的。
具体来说,我们有我们的 CI 运行命令:
-
替换容器定义中的图像标签。
将
.ebextensions/
和Dockerrun.aws.worker.json => Dockerrun.aws.json
复制到单独的文件夹中。
该单独的文件夹(共 4 个文件)已压缩。
最终使用eb deploy
部署。
【讨论】:
以上是关于每个环境单独的 Dockerrun.aws.json的主要内容,如果未能解决你的问题,请参考以下文章