每个环境单独的 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.acceptanceDockerrun.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的主要内容,如果未能解决你的问题,请参考以下文章

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

`anaconda`是否为每个新环境创建一个单独的PYTHONPATH变量?

MEF 和单独的接口组件导致“每个类的接口”

单独的环境配置弹性beantalk

将每个数据库放在自己的环境中是不是有任何优势?

关于Ubuntu下各个Python版本的管理之为每个单独的Python安装pip