我正在将一个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 博客文章说:“通过运行chmod +x app.sh,确保app.sh文件是可执行的”,这是我在本地回购中所做的。不管怎么说,我想直接在吊舱里再做一次,但它不起作用:
(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那么,如何将x权限设置为app.sh?谢谢
发布于 2017-09-07 15:05:07
在不深入了解更多细节的情况下,任何S2I构建器映像都将乐于使用您提供的自定义run脚本以另一种方式启动应用程序。
在源代码目录中创建.s2i/bin/ (注意点),将run脚本放入其中并在OpenShift中重新构建应用程序--在部署时它将自动使用您的自定义run脚本。
这是使用OpenShift中的自定义命令启动应用程序的首选方法。
关于当前的问题,有一个非常简单的原因可以解释为什么不能更改脚本的权限:您试图修改已部署的pod中的权限,而不是构建器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来完成它,因此文件所有权不应该是一个问题。
发布于 2020-03-14 20:25:17
当我自己偶然发现这个问题时,我找到了解决这个问题的方法。您必须使您的文件app.sh可执行,并推动它在您的回购作为这样。如果git没有像对我一样跟踪此修改,则必须使用:git update-index --chmod=+x app.sh才能使其工作。
https://stackoverflow.com/questions/46091601
复制相似问题