Azure DevOps任务容器访问流水线工件权限不足问题
问题根因
报错来自两个基础配置错误,和容器无法读取宿主机文件没有关系:
- 路径分隔符使用错误:配置里用了Windows系统的反斜杠
\拼接路径,但你使用的java-build是Linux基础镜像,容器内默认运行bash环境,反斜杠在bash中是转义字符,不会被识别为路径分隔符。Azure DevOps启动容器作业时,会自动把宿主机上的流水线工作目录挂载到容器内的/__w/<作业编号>/路径下,$(build.ArtifactStagingDirectory)变量在容器里对应的路径末尾本身就是/a(即制品暂存目录的目录名),你写的\MyApi里的反斜杠直接把a后面的路径斜杠转义吞掉了,最终拼接出的错误路径就是/__w/6/aMyApi,这就是文件名前莫名出现a字符的来源。 - 不存在跨容器手动拷贝文件的需求:Azure DevOps的容器作业默认会把整个流水线工作区(包含源码、构建产物、临时目录)通过卷挂载的方式映射进容器,只要路径配置正确,容器可以直接访问代理节点上流水线生成的所有文件,不需要额外做文件复制操作。
修复方案
- 先把路径里所有Windows风格的反斜杠替换为Linux系统使用的正斜杠
/,修正后的脚本段如下:
- script: | curl -sSO https://downloads.veracode.com/securityscan/pipeline-scan-LATEST.zip unzip -o pipeline-scan-LATEST.zip java -jar pipeline-scan.jar -vid $(ID) -vkey $(SECRET) -f $(build.ArtifactStagingDirectory)/MyApi || true target: container: java displayName: Run Veracode Scan
- 如果修正路径后仍然提示权限不足,直接给容器加启动参数用root用户运行,可一次性解决权限问题:
resources: containers: - container: java image: somepackagerepo.com/java-build options: --user 0
如果不想用root用户运行,也可以在执行java命令前加一行给目录开放读权限的命令:
chmod -R 755 $(build.ArtifactStagingDirectory)
注意事项
如果MyApi是目录而非具体的制品文件,需要把-f参数的路径指向目录内具体的.jar/.war等待扫描文件,否则Veracode工具本身也会抛出文件读取错误。
内容的提问来源于stack exchange,提问作者845614720
相关产品推荐
相关产品推荐

