OpenShift构建报错:非零(13)退出码,寻求解决方案
我来帮你分析下这个问题:你遇到的是S2I构建过程中非root用户权限不足的问题,构建镜像(registry.access.redhat.com/dotnet/dotnet-20-rhel7)试图修改/opt/app-root/src目录下的文件(比如.gitconfig、username、password这些)的组和权限,但因为OpenShift默认以非root用户运行构建流程,导致操作被拒绝,最终构建失败(退出码13)。
下面是几个针对性的解决方案:
排除敏感/不必要的文件出现在构建上下文
你看到的.gitconfig、username、password这些文件属于本地git配置或凭证,完全不应该被包含在代码仓库或构建上下文里。请把这些文件添加到项目根目录的.gitignore文件中,避免它们被传入S2I构建环境:# .gitignore 新增内容 .gitconfig username password这样构建流程就不会试图处理这些不属于应用代码的文件,从根源上避免权限问题。
升级到较新的.NET Core S2I镜像
你当前使用的dotnet-20-rhel7是非常老旧的版本(.NET Core 2.0早已停止支持),新版本的Red Hat .NET Core镜像(比如dotnet-60-rhel8或更高版本)已经优化了构建流程中的权限处理,默认会以更友好的方式处理文件权限,大概率能解决这类问题。调整构建的安全上下文(谨慎操作)
如果确实需要在构建过程中修改文件权限,可以给OpenShift的builder服务账号赋予anyuid安全上下文约束(SCC),允许构建过程以root用户运行:oc adm policy add-scc-to-user anyuid -z builder注意:这个操作会提升builder账号的权限,仅限测试或非生产环境使用,生产环境建议优先用前两种方案。
自定义S2I构建脚本跳过权限修改
你可以在项目根目录创建.s2i/bin/assemble自定义脚本,覆盖原镜像的默认assemble流程,跳过那些会触发权限错误的chgrp/chmod操作。脚本示例:#!/bin/bash # 跳过原镜像中修改文件组和权限的步骤,直接执行.NET构建 dotnet restore dotnet publish -c Release -o ./publish记得给这个脚本添加可执行权限:
chmod +x .s2i/bin/assemble,然后提交到代码仓库。
内容的提问来源于stack exchange,提问作者Prasanna K Rao

