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

Deploy a Dockerized Symfony2 application on AWS Elastic Beanstalk

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


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

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

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

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

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

第 8 个项目符号 是我的全部观点和问题:

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

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

当然必须有办法使它正确。我相信我走得很远,但我有些地方错了。任何提示将不胜感激。

这个 post 完全值得一个 TL;DR 部分

  1. 您可以从 Dockerhub 切换到 Tutom,后者提供 10 个免费的私有存储库
  2. 您不应在 docker 中放置硬编码参数。这与拥有 docker 图像
  3. 的整个观点相矛盾
  4. 您应该使用 EB 环境变量在运行时动态 add/remove 环境变量。这将使您无需每次都重新构建 docker(您只需要从 aws 控制台重新启动应用程序服务器,这只需要一分钟)
  5. 您可以加​​密您的环境变量的值,并在您的代码中解密它们。这样他们就成了秘密。