在Openshift online v3上无法chmod文件:不允许操作

时间:2017-09-07 08:32:48

标签: django openshift

我正在将一个Django应用程序从Openshift v2迁移到v3(如果您不知道,RedHat将于9月30日关闭v2,请参阅:https://blog.openshift.com/migrate-to-v3-v2-eol/

所以,我正在关注这篇博文来帮助我:https://blog.openshift.com/migrating-django-applications-openshift-3/。我是所有这些新版本构建的Docker / Kubernetes概念的新手。

我能够取得一些进展:我设法成功构建了我的应用程序。然而它在部署时崩溃了:

---> Running application from script (app.sh) ... /usr/libexec/s2i/run: line 42: /opt/app-root/src/app.sh: Permission denied

确实,app.sh失去了x权限。我作为调试登录到失败的容器并查看它:

> oc debug dc/<my app>
> (app-root)sh-4.2$ ls -l /opt/app-root/src/app.sh 
-rw-rw-r--. 1 default root 127 Sep  6 21:20 /opt/app-root/src/app.sh 

博客发布状态&#34;通过运行chmod + x app.sh。&#34;确保app.sh文件是可执行的,这是我在本地仓库上执行的。无论如何,我想直接在pod中再做一次,但它不起作用:

(app-root)sh-4.2$ chmod +x /opt/app-root/src/app.sh                             
chmod: changing permissions of ‘/opt/app-root/src/app.sh’: Operation not permitted

那么,如何设置app.sh的x权限?谢谢

2 个答案:

答案 0 :(得分:1)

如果不查看更多详细信息,任何S2I构建器映像都会很乐意使用您自定义提供的run脚本以另一种方式启动应用程序。

在源代码目录中创建.s2i/bin/(请注意点),将run脚本放入其中并在OpenShift中重建应用程序 - 它将自动使用您的自定义run脚本部署。

这是在OpenShift中使用自定义命令启动应用程序的首选方法。

关于您的直接问题,有一个非常简单的原因,您无法更改脚本的权限:您尝试修改已部署的窗格中的权限,而不是修改构建器窗格。已部署的pod使用不同的UID运行,通常在100000000的范围内,并且肯定与构建生成的文件所有权不匹配。因此许可被拒绝。

问题的根本原因(app.sh失去可执行权限)必须与构建过程安装这些文件的方式相同,实际上查看基本映像中的/usr/libexec/s2i/assemble脚本确实显示罪魁祸首。最后两行是:

# set permissions for any installed artifacts
fix-permissions /opt/app-root

如果您想更改构建的这一部分而不是使用自定义run脚本,我建议您在项目的源代码中创建.s2i/bin/assemble并使其看起来像像这样:

#!/bin/bash
echo "Running stock build:"
${STI_SCRIPTS_PATH}/assemble
echo "Fixing the mess:"
chmod 755 /opt/app-root/src/app.sh

这将修复库存构建过程对文件权限所做的任何操作,并且将使用与构建的其余部分相同的UID来执行此操作,因此文件所有权不应成为问题。

答案 1 :(得分:0)

当我自己偶然发现此问题时,我找到了解决该问题的方法。 您必须将文件app.sh设置为可执行文件,然后将其推送到存储库中。 如果git无法像我那样跟踪此修改,则必须使用git update-index --chmod=+x app.sh才能使它生效。