You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:15:09