WSL中Snap安装Docker后运行Bazel的container_run_and_commit出现DBus错误
错误根因
该错误触发原因是Snap版本的Docker默认依赖systemd的DBus服务创建临时运行scope,而WSL环境默认未配置完整的systemd/DBus会话,Bazel调用Docker时进程环境不匹配就会抛出对应报错。
修复方案
方案1(推荐,彻底解决兼容问题):替换Snap版Docker为官方标准安装包
- 先卸载当前Snap安装的Docker:
sudo snap remove docker --purge
- 安装Docker官方适配WSL的标准版本:
# 安装基础依赖 sudo apt update sudo apt install ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 导入Docker软件源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker核心组件 sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 将当前用户加入docker用户组,避免每次调用Docker需要sudo权限:
sudo usermod -aG docker $USER newgrp docker
方案2(临时修复,无需重装Docker)
运行Bazel命令时手动清空DBus会话环境变量,跳过Docker的scope创建检查:
DBUS_SESSION_BUS_ADDRESS="" bazel <你的Bazel执行命令,如build/run对应的目标规则>
如果仍然报错,可额外添加Bazel沙箱权限参数,允许沙箱直接访问Docker套接字:
DBUS_SESSION_BUS_ADDRESS="" bazel <执行命令> --sandbox_writable_path=/run/docker.sock
额外排查项
- 确认当前使用WSL2而非WSL1,WSL1对Docker的运行支持存在原生缺陷
- 如果你已经开启WSL2的systemd支持,可先检查Docker服务状态是否正常:
sudo systemctl status docker # 若服务未启动,执行以下命令开启并设置开机自启 sudo systemctl enable --now docker
内容的提问来源于stack exchange,提问作者a11hard
相关产品推荐
相关产品推荐

