如何在 Elastic Beanstalk 上为特定容器设置文件夹权限

Posted

技术标签:

【中文标题】如何在 Elastic Beanstalk 上为特定容器设置文件夹权限【英文标题】:How to set folder permissions for a particular container on Elastic Beanstalk 【发布时间】:2016-04-28 22:22:08 【问题描述】:

我在为 Elastic Beanstalk 上的 Web 文件夹设置权限时遇到问题。我在一个实例中使用自定义 docker 映像运行多个容器:apache-phpmysql、memcached 等。对于容器“apache-php”,我将一个文件夹与我的 yii2 应用程序映射到 /var/www/html/。

当我手动制作捆绑包并通过 Elastic Beanstalk 控制台进行上传/部署时,我确实拥有该文件夹的正确权限并且一切正常。

现在,当我使用“eb deploy”部署应用程序时,它会删除所有权限,并且出现服务器错误和“Web 进程无法写入该目录:/var/www/html/backend/web/assets " 在日志中。

我可以通过 ssh 连接并手动设置必要的权限,但这确实不方便,因为每次重新部署应用程序时都需要这样做。

那么,我的问题是在 Elastic Beanstalk 上为特定容器中的特定文件夹自动设置权限的最佳方法是什么?

也许,我可以使用 .ebextensions,但我没有找到如何为特定容器运行“container_commands”。

【问题讨论】:

【参考方案1】:

AWS EB 部署在 /var/app/ondeck 中启动您的应用程序

    部署 elastic beanstalk 时,您的应用首先解压缩到 /var/app/ondeck/ 很可能,您正在部署的本地文件夹没有您想要的权限。 如果您需要在部署期间对您的应用程序或外壳进行调整,.ebextensions/*.config 是您的最佳选择。

容器命令应该运行到那个路径

但请记住,这些命令将在您每次部署时运行,无论是否需要,除非您使用某种方法来测试预配置。

container_commands:
  08user_config:
    test: test ! -f  /opt/elasticbeanstalk/.preconfig-complete
    command: |
      echo "jail-me" > /home/ec2-user/.userfile
  09writable_dirs:
    command: |
       chmod -R 770 /var/app/ondeck/backend/web/assets
       chmod -R 770 /var/app/ondeck/[path]
  99complete:
    command: |
      touch /opt/elasticbeanstalk/.preconfig-complete

files:
  "/etc/profile.d/myalias.sh":
    mode: "000644"
    owner: root
    group: root
    content: |
      alias webroot='cd /var/www/html/backend/web; ls -al --color;'
      echo " ========== "
      echo " The whole point of Elastic Beanstalk is that you shouldn't need to SSH into the server. "
      echo " ========== "

【讨论】:

嗨@Tony,您能否检查一下我在尝试commands: 03_attachment_directory_permission: command: chmod 777 /var/app/ondeck/manellen/ticketing/attachments/ 时会出现错误,并在日志文件中返回错误because: (ElasticBeanstalk::ExternalInvocationError) @Manellen,你不应该使用 cmets 来提问。这个问题has already been asked and answered,通常是由尝试访问尚不存在的路径上的文件引起的。即:/home 在应用部署时还不存在。此答案/etc/ profile.d/myalias.sh 中创建的文件不存在。 /var/app/ondeck 一切都在准备中。 @TonyChiboucas 获得'/var/app/ondeck/my_app_folder': No such file or directory @TonyChiboucas 您能否提供有关部署目录的官方文档链接? 仅供参考,我想在这里补充一点,我也没有得到任何关于“ondeck”的信息 - python env【参考方案2】:

是的,您应该使用 ebextensions。

在您的应用源根目录中创建一个名为 .ebextensions 的文件夹。创建一个扩展名为.config 的文件,例如01-folder-permissions.config。文件按其名称的字典顺序处理。

文件内容可以是:

container_commands:
    change_permissions:
        command: chmod 777 /var/www/some-folder

替换为适当的文件夹和权限。阅读容器命令here。

【讨论】:

/var/www 在容器命令运行时还不存在。 chmod 777 不好。从不 777。无处。这是黑客的头奖。 @TonyChiboucas 我刚刚遇到这个,需要更改 /var/app/current 下文件夹的权限,但正如你所说,该文件夹不存在,我该如何执行将文件复制到实例后执行命令? @BenOsborne,见上面的my answer to this question。在部署过程中,文件夹位于/var/app/ondeck/,您可以在那里更改它们的权限。部署后,它们会从那里移至 /var/app/current/

以上是关于如何在 Elastic Beanstalk 上为特定容器设置文件夹权限的主要内容,如果未能解决你的问题,请参考以下文章

使用 Elastic Beanstalk 在 Amazon AWS 上为非 Rails ruby​​ 脚本安装 Gems

使用 Postgres 在 Elastic Beanstalk 上设置 Django

如何为我的 Elastic Beanstalk 单实例配置 SSL

AWS:具有用于外部注册器的静态 IP 地址的 Elastic Beanstalk

Elastic Beanstalk 上的 Django 中的定期任务(可能使用 celery beat)

如何在 AWS elastic-beanstalk 中更改我的 python 版本