我试图在AWS / EB上运行创建TempFile的Rails应用程序。我在开发中运行时代码正常工作,但在生产中它失败了。以下是执行的代码:
v_index_file_save = Tempfile.new(['index','.lst'])
我收到以下错误消息:
Errno::EACCES: Permission denied @ dir_s_mkdir - /var/app/current/tmp/1495598860-11267-0001-8597
我找到了一个条目,建议创建一个预编译脚本来更改/ tmp目录的权限。这是scipt:
commands:
01_set_tmp_permissions:
command: "chmod 0777 /var/app/current/tmp"
部署看似正常工作,但是/ tmp /目录上的权限没有更新。有什么建议??
答案 0 :(得分:2)
首先,你的command
没有做你想做的事情的原因是它运行得太早了。如果您选中the documentation,则说明
命令按名称按字母顺序处理,然后运行 在应用程序和Web服务器设置和应用程序之前 提取版本文件。
所以正在发生的事情是您正在更改包含即将被替换的应用程序版本的目录的权限。 (EB将新版本提取到/var/app/ondeck
,删除/var/app/current
,最后将/var/app/ondeck
重命名为/var/app/current
。)
使用这样的container command可能会有更多的运气:
container_commands:
01_set_tmp_permissions:
command: "chmod 0777 /var/app/ondeck/tmp"
容器命令稍后在部署中运行,因此它可能会执行您想要的操作。
话虽如此,您应该已经拥有/var/app/current/tmp
的写入权限。运行ls -ld /var/app/current/tmp
会发生什么?您的应用运行的用户是什么用户?
答案 1 :(得分:1)
由于我在2020年仍然遇到此问题,并且此修复程序对我而言并不奏效,所以我想我应该分享一下。
在重新阅读了有关容器命令的EB AWS文档之后,我更改了/var/app/ondeck/tmp
的权限,而不是/var/app/staging/tmp
:
指定的命令以root用户身份运行,并按名称的字母顺序进行处理。容器命令从暂存目录运行,在将源代码部署到应用程序服务器之前,会在其中提取源代码。当将源部署到最终位置时,使用容器命令对登台目录中的源代码进行的任何更改都将包括在内。
所以最后我的扩展名是这样的:
container_commands:
01_set_tmp_permissions:
command: "chmod -R go+w /var/app/staging/tmp/cache"
它有效!如在:关于下一个问题:D
PS。 Shopify / bootsnap中有一个线程与此问题相关,仅供参考:https://github.com/Shopify/bootsnap/issues/171。我也把解决方案也张贴在那里。