如何修复OpenShift Tekton任务中rm资源繁忙无法删除工作空间错误?
解决Tekton流水线中cleanup任务的"rm: can't remove '/workspace/source': Resource busy"错误
错误含义
这个错误说明你要删除的/workspace/source目录正被当前进程占用,无法执行删除操作。你的cleanup任务里设置了workingDir: $(workspaces.source.path),意味着执行rm命令的shell进程当前工作目录就是这个要删除的目录——系统不允许删除一个正在被进程作为当前工作目录的路径,因此抛出"资源繁忙"的提示。
解决方案
方法1:修改任务的工作目录
把执行rm命令的工作目录切换到非目标目录(比如/tmp),这样就不会因为进程占用目标目录而无法删除:
--- apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: cleanup spec: description: This task will clean up a workspace by deleting all the files workspaces: - name: source steps: - name: remove image: alpine:3 env: - name: WORKSPACE_SOURCE_PATH value: $(workspaces.source.path) workingDir: /tmp # 切换到临时目录执行删除操作 securityContext: runAsNonRoot: false runAsUser: 0 script: | set -eu echo "Removing all files from ${WORKSPACE_SOURCE_PATH} ..." if [ -d "${WORKSPACE_SOURCE_PATH}" ] ; then rm -rf "${WORKSPACE_SOURCE_PATH:?}" fi
方法2:删除目录内的内容而非目录本身
如果不需要删除目录,只需要清空其中的文件,可以修改rm命令只删除目录下的所有内容,保留目录本身:
--- apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: cleanup spec: description: This task will clean up a workspace by deleting all the files workspaces: - name: source steps: - name: remove image: alpine:3 env: - name: WORKSPACE_SOURCE_PATH value: $(workspaces.source.path) workingDir: $(workspaces.source.path) securityContext: runAsNonRoot: false runAsUser: 0 script: | set -eu echo "Removing all files from ${WORKSPACE_SOURCE_PATH} ..." if [ -d "${WORKSPACE_SOURCE_PATH}" ] ; then rm -rf "${WORKSPACE_SOURCE_PATH:?}"/* # 仅删除目录内的所有内容 fi
方法3:检查流水线的任务执行顺序
如果你的流水线中存在其他任务和cleanup任务并行使用同一个source workspace,也会导致目录被占用。确保cleanup任务在所有依赖该workspace的任务(比如你的nose任务)执行完成后串行运行,避免资源冲突。
内容的提问来源于stack exchange,提问作者Sarah Pinheiro
相关产品推荐
相关产品推荐

