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

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


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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: symfony nginx docker environment-variables amazon-elastic-beanstalk


    【解决方案1】:

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

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

    【讨论】:

    • #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 文件中 - 我弄错了吗?
    猜你喜欢
    • 2018-09-13
    • 2017-08-01
    • 2012-09-24
    • 2015-07-06
    • 2013-08-05
    • 2012-12-16
    • 2017-09-28
    • 2020-04-29
    • 2017-05-11
    相关资源
    最近更新 更多