Windows PowerShell GitLab Runner执行Docker命令报“Protocol Not Available”错误
解决GitLab Runner执行Docker命令报“Protocol Not Available”错误的思路
1. 检查GitLab Runner服务的运行权限
- GitLab Runner默认以Local System账户运行,而Windows上Docker需要用户拥有访问守护进程的权限。尝试将Runner服务的登录账户替换为EC2实例上能正常执行Docker命令的本地管理员账户:
- 打开Windows服务管理器,找到
gitlab-runner服务 - 右键选择属性,切换到“登录”标签页,选择“此账户”,输入本地管理员的账户名和密码
- 重启GitLab Runner服务后重新触发流水线测试
- 打开Windows服务管理器,找到
2. 确认Docker守护进程的连接协议配置
- Windows上Docker默认使用npipe协议,需确保Runner执行环境能正确识别该协议:
- 在Runner的PowerShell任务中执行
echo $Env:DOCKER_HOST,确认输出为npipe:////./pipe/docker_engine - 如果未设置该环境变量,在流水线的
before_script中添加:$Env:DOCKER_HOST = "npipe:////./pipe/docker_engine",再执行后续Docker命令
- 在Runner的PowerShell任务中执行
3. 验证Docker管道的权限设置
- Docker的npipe管道权限可能限制了Runner账户的访问:
- 在EC2实例的管理员PowerShell中执行:
Get-Acl -Path \\.\pipe\docker_engine | Format-List - 检查权限条目,确保GitLab Runner的运行账户(或其所属组)拥有
Read和Write权限 - 若缺少权限,执行命令添加:
替换$acl = Get-Acl \\.\pipe\docker_engine $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("RUNNER_USER_ACCOUNT", "Read,Write", "Allow") $acl.AddAccessRule($rule) Set-Acl \\.\pipe\docker_engine $aclRUNNER_USER_ACCOUNT为实际的Runner运行账户名
- 在EC2实例的管理员PowerShell中执行:
4. 排查防火墙或杀毒软件的阻断
- Windows Defender防火墙或第三方杀毒软件可能阻断了Runner与Docker守护进程的通信:
- 临时关闭Windows Defender防火墙,重新触发流水线测试
- 若问题解决,添加允许GitLab Runner进程访问Docker管道的入站/出站规则
5. 检查GitLab Runner的PowerShell执行策略
- 过严的PowerShell执行策略可能限制命令执行:
- 在Runner任务中执行
Get-ExecutionPolicy,确保设置为RemoteSigned或Unrestricted(注意评估安全风险) - 若需修改,在EC2实例的管理员PowerShell中执行:
Set-ExecutionPolicy RemoteSigned -Force,之后重启Runner服务
- 在Runner任务中执行
内容的提问来源于stack exchange,提问作者needTobeanSRE
相关产品推荐
相关产品推荐

