在 AWS Elastic Beanstalk 上部署 Dockerized Symfony2 应用程序

Posted

技术标签:

【中文标题】在 AWS Elastic Beanstalk 上部署 Dockerized Symfony2 应用程序【英文标题】:Deploy a Dockerized Symfony2 application on AWS Elastic Beanstalk 【发布时间】:2016-01-24 12:47:41 【问题描述】:

重要提示:这个问题与 Symfony 和 Elastic Beanstalk Docker 平台的古老版本有关。环境变量在 Symfony 4+ 中是一等公民,因此下面描述的问题不再存在。


部署多容器 docker symfony 应用程序的正确方法是什么?

到目前为止,我有以下知识库和情况:

    我的 docker-compose 环境在本地工作,由 nginxphp5-fpm、memcached、mysql 和 mailcatcher 组成 我正在使用多容器 EB 应用程序,目标是使用单独的配置运行单独的“测试”和“生产”环境 我已经知道我不能简单地在 EB 中构建整个东西并且必须已经构建了图像,因此我将它们全部放在了这里:https://hub.docker.com/u/sunbake/dashboard/ 我知道我可以为每个 EB 环境设置自定义环境变量 我知道 SYMFONY__WHATEVER_NAME 可以很容易地用作应用程序参数

现在真正困扰我并正在询问如何以更好的方式做到这一点?

    插入数据库密码等敏感值似乎有点可疑 - 如果不出意外,html 输入字段值可以存储在浏览器缓存/历史记录中 为整个操作系统设置包含敏感数据的环境变量几乎是一样的——想象一下有人获得任何类型的系统访问权限,然后打印环境变量。即使这是唯一可能做的事情,得到一个不好的明文密码 为了通过 nginx 获取环境变量到通过 php-fpm 运行的 PHP 脚本,nginx 配置文件必须传递它们。换句话说,如果我想使用这种方法,我必须在我的 nginx.conf 中有硬编码参数(是的,没有值,但请继续阅读)。

第八条是我的重点和问题:

    鉴于本文中的第 3 个项目符号,这意味着我每次要添加参数时都必须重建整个图像,这可以做到,但似乎是开销,也意味着我不能使用多个应用程序的图像,可能具有不同的参数 鉴于图像及其来源必须是公开的(在此用例中我不打算为 docker hub 付费),它还公开了应用程序的部分工作原理。例如,如果潜在的攻击者能够以某种方式执行代码来列出我的 env 变量,他就会知道要准确查找哪些 env 变量。

我希望使用整个 bitbucket-docker-dockerhub-eb 在多个环境中自动部署:

在本地主机上使用一组特定的 docker 映像(mailcatcher、本地 mysql 实例、启用 xdebug)进行开发 AWS EB 上的测试环境,RDS 中没有邮件捕获器和数据库 生产环境与测试环境相同,但没有 xdebug 和一些小的优化调整

当然,必须有一种方法来解决这个问题。我相信我已经走了很远,但是我弄错了一些地方。任何提示将不胜感激。

【问题讨论】:

【参考方案1】:

这篇文章完全值得一个 TL;DR 部分

    您可以从 Dockerhub 切换到 Tutom,它提供 10 个免费的私有存储库 您不应将硬编码参数放在 docker 中。这与拥有 docker 映像的全部意义相矛盾 您应该使用 EB 环境变量在运行时动态添加/删除环境变量。这将使您无需每次都重新构建 docker(您只需从 aws 控制台重新启动应用服务器,只需一分钟) 您可以加密您的环境变量的值,并在您的代码中解密它们。这样他们就成了一个秘密。

【讨论】:

#1:好的,谢谢你的提示 // #2:没错,我的帖子就是这样 // #4:好主意,谢谢!然后#3:是的,整篇文章都是关于我无法让 nginx 获取所有 EB 环境变量(及其值)并将它们传递给 PHP-FPM 的挫败感。我只能预定义这些变量,然后动态分配值。请您详细说明一下好吗? @JanKlan 您在#3 中面临的问题是什么?在弹性 beanstalk 控制台(或 cli)中定义变量后,您可以在 docker 实例中访问它们。您想在主机中访问它们吗? (例如 nginx 在哪里) 问题在于,对于我使用(或计划使用)的每个应用程序,都会有一组不同的配置参数——不是值,而是参数。我的目标是拥有一个通用的 docker 环境,它使用 Symfony 源安装一个目录,并将这个环境与不同的 Symfony 应用程序一起使用。每个应用程序最终不仅会在参数值方面有所不同,而且在一组可配置的参数方面也会有所不同。到目前为止,我知道的唯一方法是在 nginx 配置文件中硬编码环境变量名称。这只适用于每组参数一个 Symfony 应用程序,因此一个 docker 容器。 @JanKlan 每次将 docker 容器添加到多容器环境时,都需要更改 Dockerrun.aws.json 文件。在该文件中,您还包含一个特定于要启动的新 docker 的环境变量列表。 是的,但问题在于“添加新容器”,而是“添加 Nginx 将传递给 PHP 的新环境变量”和无法在 Dockerrun.aws.json 文件中修改的 AFAIK,但是在 Nginx 的一个 .conf 文件中 - 我弄错了吗?

以上是关于在 AWS Elastic Beanstalk 上部署 Dockerized Symfony2 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 上扩展 Magento

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

在 AWS Elastic Beanstalk 上运行节点和反应

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

在aws elastic beanstalk上上传文件?