docker - 在 Azure 管道中使用 Docker 映像作为构建代理时出现错误
问题描述
我正在尝试使用 Docker 映像作为 Azure 管道中的构建代理。我正在使用 Azure DevOps Server 2019 和 Docker 企业版。
管道运行时出现此错误:
##[section]Starting: Initialize containers
##[command]C:\Program Files\Docker\docker.EXE version --format '{{.Server.APIVersion}}'
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/version: open //./pipe/docker_engine: Access is denied. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
'
##[error]Exit code 1 returned from process: file name 'C:\Program Files\Docker\docker.EXE', arguments 'version --format '{{.Server.APIVersion}}''.
##[section]Finishing: Initialize containers
我已验证 Docker 已安装在服务器上。我运行了以下命令以确保 Docker 正在服务器上运行并且全部成功运行:
Start-Service Docker
docker network ls
docker version
这是我正在使用的管道 YAML 文件:
trigger:
none
resources:
containers:
- container: angulardocker
image: mdailey77/angularbuild:1.0
endpoint: Docker Hub
stages:
- stage: Client
jobs:
- job: BuildTest
pool:
name: Default Windows
container: angulardocker
steps:
- task: Npm@1
displayName: 'Client Build'
inputs:
command: custom
customCommand: run build -- --prod
workingDir: client
- task: CopyFiles@2
displayName: 'Copy Client Build to Staging Directory'
inputs:
contents: '**'
SourceFolder: $(Build.SourcesDirectory)/client/dist
targetFolder: $(Build.ArtifactStagingDirectory)/client
- task: PublishBuildArtifacts@1
displayName: 'Publish Build Artifact - Client'
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)/client'
artifactName: 'Client'
错误发生在初始化容器管道步骤。Microsoft 文档中关于 Docker 映像作为构建代理的文档至少可以说是缺乏的。这根本没有帮助。我发现这篇文章有最好的例子:https ://im5tu.io/article/2018/12/building-a-custom-build-agent-image-with-docker-and-azure-devops-pipelines/ 。我无法弄清楚错误并暂时卡住了。
更新:在做了更多研究和@vaibhavnd 建议之后,我相当确定问题是我的管道构建代理无法访问 Docker 守护进程。确实如此,Microsoft 文档中提到了这一点,但实际上并没有说明如何做到这一点。如何配置我的构建代理以便他们可以访问?步骤是什么?
更新 2:我考虑将用户添加到 docker-user 组,但服务器上没有这样的组。根据一篇 GitHub 帖子,docker 用户组应该在安装 Docker 并重新启动后自动创建。我重新启动了服务器,但该组仍然不存在。
解决方案
我想出了如何解决这个问题。这篇GitHub 帖子对我很有帮助。我使用了帖子中提到的 dockeraccesshelper。我授予与我的管道构建代理关联的帐户,因此在这种情况下,“NT AUTHORITY\NETWORK SERVICE”可以访问 Docker。一旦我这样做了,我的管道就能够初始化 Docker 容器。
走 docker-user 组路线对我不起作用。我安装 Docker Enterprise 时没有自动创建 docker-user 组。我认为在 Windows Server 2019 上使用 Docker Enterprise 时这可能是正常的。我尝试自己创建组并将“NT AUTHORITY/NETWORK SERVICE”帐户添加到组,但无法添加。
推荐阅读
- javascript - Api fetch on gatsby 在 GraphQL 中产生错误
- java - Img src 正在使用当前 url 的相对路径而不是站点的根目录
- rust - 如何测试特定类型的盒装错误?
- php - 如何将json插入mysql中的json数组?
- mvvm - Blazor:如何通过 URL 将参数传递给 ViewModel(而不是页面/视图)
- flutter - 如何使用颤动在列表视图项目中使用不同按钮更改文本的颜色
- r - rpart包中的剪枝,以及参数“cp”的使用
- ios - 在编辑模式下滚动时,SwiftUI 多选列表表现得很奇怪
- python - 使用 ctypes 从 numba 调用 fortran
- html - 是否可以在 GitHub Flavored Markdown 中创建带有 'target="_blank"' 的链接?