我正在将一个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权限?谢谢
答案 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
才能使它生效。