You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure DevOps Pipelines中正确使用Docker?排查运行异常

Azure DevOps Pipeline中Docker容器启动失败的问题修复

问题场景

在Azure DevOps Pipeline中执行Docker操作,已成功登录ACR并拉取镜像,但调用start命令时提示“无此容器”。添加检查脚本后发现容器启动后立即退出,但该镜像在本地环境运行正常。

原Pipeline配置

steps:
    - checkout: self
      clean: true
      fetchDepth: full

    - task: Docker@2
      displayName: Login to ACR
      inputs:
        containerRegistry: 'Docker'
        command: 'login'
    
    - script: |
        docker run -d docker.io/Docker/Sample-docker-image
      displayName: 'Run Docker'

    - task: Docker@2
      inputs:
        containerRegistry: 'Docker'
        command: 'start'
        container: 'Docker/Sample-docker-image'

报错信息

Error response from daemon: No such container: ***/Docker/Sample-docker-image
Error: failed to start containers: ***/Docker/Sample-docker-image
##[error]Error response from daemon: No such container: ***/Docker/Sample-docker-image
##[error]Error: failed to start containers: ***/Docker/Sample-docker-image
##[error]The process '/usr/bin/docker' failed with exit code 1

自行添加的检查脚本

container_id=$(docker run -d Docker/Sample-docker-image)
echo "Container ID: $container_id"
echo "##vso[task.setvariable variable=container_id]$container_id"
container_id=$(echo $container_id)
   
while [[ "$(docker inspect -f '{{.State.Status}}' $container_id)" != "running" ]]; do
  docker inspect $container_id
  docker logs $container_id
  sleep 10
  docker ps -a
done

错误原因

  1. start命令参数错误:docker start需要传入容器名称或容器ID,而你用了镜像名Docker/Sample-docker-image。docker run启动容器时,若未指定名称,Docker会自动分配随机名称,不会使用镜像名作为容器标识。
  2. 容器启动后无前台进程:本地运行正常但Pipeline中容器立即退出,多数是因为容器启动后没有持续运行的前台进程,导致Docker认为任务完成自动退出;也可能是Pipeline代理环境与本地存在差异(如环境变量缺失、资源不足)。

修复方案

方案1:指定容器名称操作

给容器指定明确名称,后续用该名称执行start命令:

steps:
    - checkout: self
      clean: true
      fetchDepth: full

    - task: Docker@2
      displayName: Login to ACR
      inputs:
        containerRegistry: 'Docker'
        command: 'login'
    
    - script: |
        # 启动容器时指定名称为sample-container
        docker run -d --name sample-container docker.io/Docker/Sample-docker-image
        # 短暂等待后检查容器状态
        sleep 5
        docker ps -a
        # 查看日志排查可能的退出原因
        docker logs sample-container
      displayName: 'Run and Verify Docker Container'

    # 仅当容器存在时执行启动(若容器未退出则无需此步骤)
    - task: Docker@2
      inputs:
        containerRegistry: 'Docker'
        command: 'start'
        container: 'sample-container'
      condition: succeeded()

方案2:捕获容器ID进行操作

通过脚本捕获docker run返回的容器ID,后续用ID执行操作:

steps:
    - checkout: self
      clean: true
      fetchDepth: full

    - task: Docker@2
      displayName: Login to ACR
      inputs:
        containerRegistry: 'Docker'
        command: 'login'
    
    - script: |
        # 启动容器并捕获ID
        container_id=$(docker run -d docker.io/Docker/Sample-docker-image)
        echo "Container ID: $container_id"
        # 将ID存入Pipeline变量
        echo "##vso[task.setvariable variable=container_id]$container_id"
        # 检查容器状态和日志
        docker inspect $container_id
        docker logs $container_id
      displayName: 'Run Docker and Capture Container ID'

    - task: Docker@2
      inputs:
        containerRegistry: 'Docker'
        command: 'start'
        container: '$(container_id)'
      condition: succeeded()

关键注意点

  • 确保容器前台运行:检查Dockerfile的CMD或ENTRYPOINT,确保启动的是前台进程(如CMD ["python", "app.py"])。如果是后台进程,可在docker run时添加-it参数强制前台运行,或修改Dockerfile。
  • 环境一致性检查:对比Pipeline代理与本地的环境变量、资源配置,必要时在docker run中通过--env传入缺失的环境变量,或用--memory/--cpus调整资源限制。
  • 日志优先排查:无论容器是否正常运行,都要查看docker logs输出,这是定位退出原因最直接的方式。

内容的提问来源于stack exchange,提问作者Cezu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:45:01