如何在Azure虚拟机规模集构建代理上配置Docker
解决方案
一、在VMSS代理池中使用常规构建代理的镜像
Azure Pipelines托管代理的预装有Docker等工具的镜像可直接用于创建VMSS,无需使用默认的Ubuntu官方镜像。修改az vmss create命令的--image参数,指定微软官方提供的托管代理镜像:
az vmss create --name my-vmss \ --image microsoft-azure-devops:ubuntu-2204:latest:latest \ --vm-sku Standard_D2_v3 \ --storage-sku StandardSSD_LRS \ --disable-overprovision \ --authentication-type SSH \ --generate-ssh-keys \ --upgrade-policy-mode manual \ --single-placement-group false \ --platform-fault-domain-count 1 \ --load-balancer "" \ --resource-group my-rg \ --vnet-name my-vnet \ --subnet Build
如果需要自定义镜像,也可以将托管代理的镜像导出到自己的存储账户,再基于该自定义镜像创建VMSS,确保镜像包含所有预安装工具。
二、修复无根Docker安装卡住的问题
你的脚本卡住是因为dockerd-rootless.sh默认前台启动dockerd,导致流水线阻塞。同时缺少rootless Docker的依赖配置,修改后的脚本如下:
# 更新系统并安装依赖 sudo apt update -y sudo apt install -y apt-transport-https ca-certificates curl software-properties-common slirp4netns fuse-overlayfs uidmap # 添加Docker官方源 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update -y sudo apt install -y docker-ce docker-ce-cli containerd.io # 配置AzDevOps用户的subuid/subgid(rootless必需) sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 AzDevOps # 切换到AzDevOps用户完成rootless安装 su - AzDevOps -c "dockerd-rootless-setuptool.sh install" # 后台启动rootless dockerd,避免阻塞流水线 su - AzDevOps -c 'export PATH=/usr/bin:$PATH export XDG_RUNTIME_DIR=/home/AzDevOps/.docker/run export DOCKER_HOST=unix:///home/AzDevOps/.docker/run/docker.sock nohup dockerd-rootless.sh &' # 等待dockerd完全启动 sleep 10
关键修改点:
- 补充安装
slirp4netns和fuse-overlayfs(rootless Docker核心依赖) - 为AzDevOps用户配置subuid/subgid范围(rootless模式的权限基础)
- 使用
su - AzDevOps切换到普通用户执行rootless操作(rootless不能以root身份配置) - 用
nohup后台启动dockerd,添加sleep确保服务启动完成
三、更简便的镜像部署到VNet内ACR的方式
方式1:使用ACR Tasks直接导入镜像
无需Docker,直接通过Azure CLI将构建工件中的tar文件导入到ACR。确保ACR和存储工件的存储账户在同一VNet,或配置VNet访问规则:
# 从存储账户Blob导入tar镜像到ACR az acr import --name <你的ACR名称> \ --source <tar文件的Blob URL> \ --image <目标镜像名:标签> \ --resource-group <资源组名>
方式2:VMSS初始化时预装Docker
在创建VMSS时使用自定义脚本扩展,让实例启动时自动安装Docker,避免每次流水线重复安装:
创建一个install-docker.sh脚本:
#!/bin/bash apt update -y apt install -y docker.io systemctl enable docker systemctl start docker usermod -aG docker AzDevOps
然后修改az vmss create命令,添加自定义脚本参数:
az vmss create --name my-vmss \ --image Ubuntu2204 \ --vm-sku Standard_D2_v3 \ --storage-sku StandardSSD_LRS \ --disable-overprovision \ --authentication-type SSH \ --generate-ssh-keys \ --upgrade-policy-mode manual \ --single-placement-group false \ --platform-fault-domain-count 1 \ --load-balancer "" \ --resource-group my-rg \ --vnet-name my-vnet \ --subnet Build \ --custom-data install-docker.sh
这样每个VMSS实例启动后都会自动安装并配置Docker,流水线可直接使用。
内容的提问来源于stack exchange,提问作者Tompi
相关产品推荐
相关产品推荐

