如何配置Docker容器中Azure DevOps self hosted agents作为服务持续运行
Docker 版 Azure DevOps 自托管代理常驻运行配置方案
问题本质是容器默认没有配置异常退出/宿主机重启后的自动拉起规则,根据部署环境选对应方案即可,不需要修改代理本身的配置。
方案1:配置Docker原生重启策略(最简便,跨平台通用)
这是成本最低的方案,不需要额外安装组件,直接给容器加重启规则即可,优先推荐用unless-stopped策略,完全匹配常驻代理的需求:
- 几个重启策略的差异注意不要选错:
no:默认值,容器退出后不会自动重启,就是你当前的状态on-failure:仅容器以非0错误码退出时才重启,如果代理是正常退出(比如版本升级触发的退出)不会自动拉起,不适合CI代理场景always:无论容器因为什么原因退出都会自动重启,哪怕你手动执行docker stop停掉容器,只要Docker服务重启就会强制把容器拉起来,容易出现停代理维护时容器误启动的问题unless-stopped:容器异常退出、Docker服务重启、宿主机重启时都会自动拉起容器,只有你手动执行stop命令主动停掉的容器不会自动启动,是最适合代理场景的策略
如果还没创建容器,直接在docker run启动命令里加参数即可:
docker run -d --restart unless-stopped <你原本配置的其他参数,比如环境变量、卷挂载、代理镜像名>
如果容器已经创建并运行过,不需要删除重建,直接更新现有容器的重启策略即可:
docker update --restart unless-stopped <你的容器ID或者容器名称>
配置完可以手动重启下Docker服务或者宿主机,执行docker ps确认容器自动启动,再到Azure DevOps代理池确认代理状态为在线即可。
方案2:宿主机系统服务托管(稳定性更高,适合生产环境)
如果对代理可用性要求更高,担心Docker服务本身启动异常导致代理拉不起来,可以直接用宿主机的服务管理器托管容器生命周期,比Docker原生重启策略的管控粒度更细。
Linux 环境(Systemd 体系,覆盖绝大多数主流服务器发行版)
操作步骤:
- 先停掉当前手动启动的代理容器,关闭原有重启策略避免冲突:
docker stop <你的代理容器ID/名称> docker update --restart no <你的代理容器ID/名称>
- 创建systemd服务配置文件:
sudo vi /etc/systemd/system/azure-devops-agent.service
写入以下配置,注意替换成你自己的容器名和启动参数:
[Unit] Description=Azure DevOps Self-Hosted Docker Agent After=docker.service network-online.target Wants=network-online.target Requires=docker.service [Service] Type=simple # 启动前清理残留的同名旧容器,避免启动报错 ExecStartPre=-/usr/bin/docker rm -f azdo-agent # 替换成你自己的docker run完整启动命令,不要加-d参数,让systemd接管容器进程 ExecStart=/usr/bin/docker run --name azdo-agent <你的所有启动参数、代理镜像名> # 停止容器时留30秒缓冲,让代理处理完正在运行的作业再退出,避免任务异常中断 ExecStop=/usr/bin/docker stop -t 30 azdo-agent Restart=always RestartSec=10 StartLimitIntervalSec=60 [Install] WantedBy=multi-user.target
- 重载systemd配置,设置服务开机自启并立即启动:
sudo systemctl daemon-reload sudo systemctl enable --now azure-devops-agent.service
- 验证服务状态:
sudo systemctl status azure-devops-agent.service
显示active (running)即为配置成功,后续容器崩溃、Docker服务重启、宿主机重启都会自动拉起代理。
Windows 环境
如果是测试场景,直接用方案1的--restart unless-stopped参数就能满足需求;生产环境可以用NSSM将容器启动脚本注册为Windows服务,配置服务失败自动重启、开机自启即可。
踩坑提醒
- 启动容器不要加
--rm参数,否则容器退出后会被自动删除,重启策略完全不生效 - 代理的工作目录、认证凭据一定要通过Docker卷挂载到宿主机存储,否则容器重建后会丢失配置,每次重启都要重新注册代理,还会在代理池里产生大量无用的离线代理记录
- 配置完成后一定要模拟异常场景验证:手动kill代理进程、重启Docker服务、重启宿主机,确认代理可以自动恢复上线,不要等跑流水线的时候才发现自启配置失效
- 如果代理部署在云服务器上,记得关闭云主机的自动休眠、定时关机策略,宿主机本身关机的话上层的容器自启配置不会生效
内容的提问来源于stack exchange,提问作者Dave Michaels
相关产品推荐
相关产品推荐

