配置Azure DevOps自托管Docker代理为非root用户:权限问题
Azure DevOps自托管代理非Root容器化部署问题解决方案
一、修改Dockerfile规避非Root用户装包权限错误
核心思路很简单:用Root身份完成所有依赖安装,再切换到非Root用户运行代理——毕竟装包必须Root权限,但运行阶段用非Root完全符合安全要求,全程不用sudo。
可用Dockerfile示例
# 基础镜像选官方代理镜像或者Ubuntu/Debian镜像都可以 FROM mcr.microsoft.com/azure-pipelines/vsts-agent:ubuntu-22.04 AS build # Root身份下完成依赖安装 RUN apt-get update && \ apt-get install -y --no-install-recommends \ git \ curl \ # 这里加你需要的其他依赖,比如python3、nodejs之类的 python3 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # 创建非Root用户,同时给代理工作目录授权 RUN useradd -m vstsagent && \ mkdir -p /azp/work && \ chown -R vstsagent:vstsagent /azp/work /azp/agent # 切换到非Root用户,后续操作都用这个用户 USER vstsagent # 启动代理的命令,和官方保持一致 CMD ["/azp/start.sh"]
注意点
- 所有
apt-get操作必须放在Root阶段,别想着用非Root用户装包,根本绕不开权限问题。 - 一定要给
/azp/work和/azp/agent目录改所有权,不然代理运行时写文件会报错。 - 非Root阶段只做启动代理的操作,别加任何需要权限的命令。
二、Rootless Docker模式运行问题修复
如果一定要在容器内用Rootless Docker(比如代理需要运行Docker命令),主要卡权限和cgroup限制,按下面步骤来:
1. 先装Rootless依赖(Root阶段)
RUN apt-get update && \ apt-get install -y --no-install-recommends \ uidmap \ slirp4netns && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
2. 给非Root用户配置Rootless Docker
切换到非Root用户后执行初始化:
USER vstsagent RUN dockerd-rootless-setuptool.sh install && \ echo "export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock" >> ~/.bashrc
3. 解决Azure容器实例的cgroup限制
Azure容器实例默认cgroup配置会导致Rootless Docker启动失败,启动容器时加个环境变量:
-e DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS="--disable-host-loopback"
或者直接写到Dockerfile里:
ENV DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS="--disable-host-loopback"
注意点
- 大部分现代Ubuntu/Debian镜像默认已经给普通用户配置了
subuid和subgid配额,要是没配的话,得在Root阶段用usermod给用户加配额。 - Rootless Docker默认不能绑1024以下的端口,要是必须用,要么改系统sysctl配置(需要Root),要么尽量用高位端口,别给自己找麻烦。
内容的提问来源于stack exchange,提问作者Ariel Rahmane
相关产品推荐
相关产品推荐

