Docker Ubuntu容器构建WebRTC时tar权限错误及参数配置疑问
在Docker容器中构建WebRTC时tar权限错误的解决办法
问题背景
在GitHub Actions的Ubuntu容器环境中执行WebRTC的fetch --nohooks webrtc和gclient sync时,频繁遇到类似以下的tar解压错误:
tar: ./usr/lib/i386-linux-gnu/libicui18n.so.67.1: Cannot change ownership to uid 376730, gid 89939: Invalid argument
原因是容器内的用户没有权限将文件所有权修改为tar包中记录的非本地uid/gid,添加--no-same-owner参数可跳过所有权修改,但需要让WebRTC的fetch流程自动应用该参数。
解决方案
方法1:临时包装tar命令
在执行fetch前,创建自定义tar脚本,让所有tar调用自动带上--no-same-owner参数。修改Build步骤的run脚本如下:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git depot_tools export PATH=$(pwd)/depot_tools:$PATH # 创建临时tar包装脚本 mkdir -p ~/bin cat > ~/bin/tar << 'EOF' #!/bin/bash exec /bin/tar --no-same-owner "$@" EOF chmod +x ~/bin/tar export PATH=~/bin:$PATH mkdir webrtc_build cd webrtc_build fetch --nohooks webrtc && gclient sync
方法2:设置gclient专属环境变量
depot_tools的gclient支持通过环境变量指定tar的额外参数,直接在fetch前添加环境变量配置:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git depot_tools export PATH=$(pwd)/depot_tools:$PATH # 设置tar默认参数 export GCLIENT_TAR_ARGS="--no-same-owner" mkdir webrtc_build cd webrtc_build fetch --nohooks webrtc && gclient sync
方法3:修改Dockerfile全局配置
如果希望容器默认自带该参数,无需每次在工作流中配置,可修改Dockerfile:
方式A:添加bash别名
FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y sudo clang build-essential cmake git libssl-dev curl python3 && \ # 给tar添加默认参数别名 echo 'alias tar="tar --no-same-owner"' >> /etc/bash.bashrc && \ rm -rf /var/lib/apt/lists/*
方式B:创建系统级tar包装脚本
FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y sudo clang build-essential cmake git libssl-dev curl python3 && \ # 创建系统级tar包装脚本 mkdir -p /usr/local/bin && \ cat > /usr/local/bin/tar << 'EOF' #!/bin/bash exec /bin/tar --no-same-owner "$@" EOF chmod +x /usr/local/bin/tar && \ rm -rf /var/lib/apt/lists/*
内容的提问来源于stack exchange,提问作者lfk
相关产品推荐
相关产品推荐

