在 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 环境在本地工作,由 nginx、php5-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 上运行节点和反应