在 Azure DevOps 中使用 podman 而不是 docker 执行 Docker@2 任务

Mar*_*rco 8 azure-devops azure-pipelines podman

我们的构建代理正在运行 Podman 3.4.2,并且每个终端会话都有一个全局别名,只需将 docker 替换为 podman,因此该命令docker --version会产生podman version 3.4.2结果。

目标是使用 podman 来执行Docker@2Azure DevOps 管道中的任务:

steps:
- task: Docker@2
  displayName: Build and push an image to container registry
  inputs:
    command: buildAndPush
    repository: aspnet-web-mhi
    dockerfile: $(dockerfilePath)
    containerRegistry: $(dockerRegistryServiceConnection)
    tags: |
      $(tag) 
Run Code Online (Sandbox Code Playgroud)

事实证明我的假设有点天真,这会起作用,因为 ado_agent 没有这些:

##[错误]未处理:无法找到可执行文件:“docker”。请验证文件路径是否存在,或者是否可以在 PATH 环境变量指定的目录中找到该文件。还要检查文件模式以验证文件是否可执行。

有没有一种方法可以让替换工作顺利进行?如果可以避免的话,我会避免自己编写所有脚本以使用 podman 而不是 docker 并将其推送到注册表。

Mar*_*rco 5

由于我需要在这方面取得进展,因此我决定沿着 bash 路线手动构建、推送、拉取和运行图像。这是它的要点:

steps:
  - task: Bash@3
    displayName: Build Docker Image for DemoWeb
    inputs:
      targetType: inline
      script: |
        podman build -f $(dockerfilePath) -t demoweb:$(tag) .
  - task: Bash@3
    displayName: Login and Push to ACR
    inputs:
      targetType: inline
      script: |
        podman login -u $(acrServicePrincipal) -p $(acrPassword) $(acrName)
        podman push demoweb-mhi:$(tag) $(acrName)/demoweb:$(tag)
  - task: Bash@3
    displayName: Pull image from ACR
    inputs:
      targetType: inline
      script: |
        podman pull $(acrName)/demoweb:$(tag) --creds=$(acrServicePrincipal):$(acrPassword)
  - task: Bash@3
    displayName: Run container
    inputs:
      targetType: inline
      script: |
        podman run -p 8080:80 --restart unless-stopped $(acrName)/demoweb:$(tag) 
Run Code Online (Sandbox Code Playgroud)

如果您决定走这条路线,请确保不要您的服务主体和密码公开为 yml 文件中的变量,而是将它们创建为机密。

我将保留这个问题 - 也许在处理 GNU/Linux 方面具有更多专业知识的人会找到一种更优雅的方法。