基于Docker与Bash脚本trap SIGTERM实现VSTS Agent启停管控
在Docker中用Bash脚本管控VSTS Agent的启动与优雅关停
我在Docker环境下折腾VSTS Agent的时候,发现手动调用官方的config.sh和run.sh太繁琐,而且容器停止时没法自动清理平台上的代理节点——于是写了个轻量的Bash脚本,把代理的注册、运行和关停管控都标准化了。
完整脚本代码
#!/bin/bash # 关停时执行:从VSTS平台移除当前代理节点 function shutdown() { echo "开始清理:从VSTS平台移除代理..." ./config.sh remove exit 0 } # 捕获容器停止信号(SIGTERM)和手动中断信号(SIGINT),触发清理逻辑 trap shutdown SIGTERM SIGINT # 切换到VSTS Agent的安装目录(根据你的实际路径调整) cd ./vsts # 执行代理配置:替换成你的VSTS实例参数 # 示例格式:./config.sh --url https://your-vsts-account.visualstudio.com --auth pat --token your-pat-token --pool "Your Agent Pool" --agent "Docker-Agent-$(hostname)" --work _work ./config.sh --url [你的VSTS实例URL] --auth pat --token [你的PAT令牌] --pool [目标代理池名称] --agent [代理节点名称] --work _work # 启动代理,开始监听任务 echo "启动VSTS Agent,等待任务分配..." ./run.sh
脚本关键部分说明
- shutdown函数:专门处理代理的优雅清理,调用官方的
config.sh remove命令,确保容器停止时,VSTS平台上不会残留无效的代理节点,避免资源浪费。 - trap命令:监听
SIGTERM(Docker容器停止时默认发送的信号)和SIGINT(手动按Ctrl+C的中断信号),不管是用docker stop还是手动中断,都会自动触发清理操作。 - config.sh配置:这里需要替换成你自己的VSTS实例参数,建议把敏感信息(比如PAT令牌)通过Docker环境变量传递(比如
docker run -e VSTS_PAT=xxx ...),脚本里用$VSTS_PAT引用,避免硬编码泄露。 - run.sh启动:启动后代理会进入持续监听状态,接收VSTS平台的任务分配,直到收到停止信号。
Docker环境额外建议
- 容器尽量以非root用户运行,符合VSTS Agent的官方安全建议,你可以在Dockerfile里创建用户并切换:
RUN useradd -m vstsagent && su - vstsagent。 - 把这个脚本设为容器的
ENTRYPOINT,确保容器启动时自动执行代理的配置和运行:ENTRYPOINT ["/path/to/your/script.sh"]。
内容的提问来源于stack exchange,提问作者Callum Linington
相关产品推荐
相关产品推荐

