如何在 Azure 管道中运行 docker 容器?

Posted

技术标签:

【中文标题】如何在 Azure 管道中运行 docker 容器?【英文标题】:How to run a docker container in Azure pipeline? 【发布时间】:2020-12-14 10:05:09 【问题描述】:

Azure 文档 (https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/docker?view=azure-devops) 未指定如何在 Azure 管道中运行 docker 容器。 我们可以使用 Docker@2 任务来构建/推送 docker 镜像,但它没有运行容器的命令。通过查看旧版本 Docker 任务的源代码,我可以看到有一个运行命令,但现在已弃用,并且找不到任何文档。

我也关注了文档:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/container-phases?view=azure-devops 使用以下 yaml,我能够提取之前推送到 ACR 的 docker 映像。 (my-acr是我通过项目设置添加的服务连接)

pool:
  vmImage: 'ubuntu-16.04'

container:
  image: somerepo/rnd-hello:latest
  endpoint: my-acr

steps:
- script: printenv

但我无法让容器运行。

【问题讨论】:

使用Docker@1任务怎么样? 下面的回复有用吗?你的问题解决了吗? 【参考方案1】:

显然问题中提到的配置将拉取图像并在容器内运行步骤(在本例中为脚本中的printenv 命令)。将自动挂载一个临时工作目录,并将在该目录中运行。 但是,这不会运行容器本身。 (不会执行Dockerfile中定义的CMD命令)

为了运行容器本身,我们必须使用 Docker@2 内置任务登录到 docker 注册表,然后手动将 docker run 作为脚本执行。这是一个例子,

trigger: none

jobs:
- job: RunTest
  workspace:
    clean: all
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - task: Docker@2
    displayName: Login to ACR
    inputs:
      command: login
      containerRegistry: my-acr
  - script: |
      docker run my-registry.azurecr.io/somerepo/rnd-hello:latest 

【讨论】:

【参考方案2】:

如果您愿意,您可以简单地使用 shell 命令来执行 docker run,然后在管道中的所有进一步步骤中简单地依赖它。您无需在 Pipelines 中使用 Docker 任务即可与守护进程通信。

另一种解决方案是使用 Azure Container Registry 来运行容器,但如果 Pipelines 出现问题,这似乎是最后的手段。

【讨论】:

我尝试将docker run somerepo/rnd-hello:latest 添加到脚本部分。但它无法识别docker 命令。 @tharinduwijewardane 您之前尝试过添加 Docker CLI 安装程序步骤吗? 不,我添加了那一步,谢谢。我想我也必须进行 docker 登录。我跑了一个ls 并没有看到之前拉的图像。有没有办法使用服务器连接?还是我必须登录提供凭据? 图像仅在每次代理运行时可用 - 它们是短暂的,因此获取的图像不会被保留。是的,您可能需要运行 docker login,具体取决于图像的来源。

以上是关于如何在 Azure 管道中运行 docker 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Kafka 消息通过管道传输到 docker 容器中?

如何使用 Azure 数据工厂管道创建容器?

如何让 MSSQL 服务容器在 Azure DevOps 管道中工作?

使用 docker 和 azure 容器注册表在 azure kubernetes 中部署 Angular 和 Spring Boot 应用程序

使用 Azure DevOps 构建管道将机密传递给容器时,Docker BuildKit 返回“/run/secrets/<secret-id>:没有这样的文件或目录”

使用本地文件共享中的块将 .NET Core docker 容器部署到 Azure