【问题标题】:How to automatically restart a Docker container with/from a clean image?如何使用/从干净的图像自动重启 Docker 容器?
【发布时间】:2022-11-24 04:18:24
【问题描述】:

我正在努力在 docker 容器中引入构建代理,并使用以下命令启动它们:

docker run -d --restart=unless-stopped --cpus="4" -m="8g" --name "${AZP_AGENT_NAME}${i}" -e AZP_URL="$AZP_URL" -e AZP_TOKEN="$AZP_TOKEN" -e AZP_AGENT_NAME="${AZP_AGENT_NAME}${i}" -e AZP_POOL="$AZP_POOL" -v /var/run/docker.sock:/var/run/docker.sock -ti dockeragent:latest --once

这允许我们在 docker 容器中运行我们的构建管道,一旦构建任务完成,容器就会重新启动(容器在完成最后一个带有参数 --once 的任务后关闭。

由于 --restart=unless-stopped 将在重新启动时保留相同的容器(和底层文件系统),因此我拥有与以前相同的容器状态(这可能是大多数用例的预期策略)。但是正如我们期望每次构建都有一个干净的容器,这不是正确的方法。

有没有办法始终从初始状态的新图像重新启动容器?

我尝试使用 --restart=unless-stopped --rm 的组合,但这让 docker 不高兴并回复 docker: Conflicting options: --restart and --rm.。我排除了要删除的容器并再次从图像中重新运行。但这可能是有道理的,因为预期的目标是再次启动同一个容器。

【问题讨论】:

    标签: docker cicd azure-devops-self-hosted-agent build-agent


    【解决方案1】:

    考虑使用像 systemd 这样的进程管理器在 Docker 管理的容器生命周期之外完成这项工作。有关详细信息,请参阅Docker docs。例如:

    [Unit]
    Description=My Service
    After=docker.service
    Requires=docker.service
    
    [Service]
    TimeoutStartSec=0
    Restart=always
    ExecStartPre=-/usr/bin/docker exec %n stop
    ExecStartPre=-/usr/bin/docker rm %n
    ExecStartPre=/usr/bin/docker pull dockeragent:latest
    ExecStart=/usr/bin/docker run --rm --name %n 
        -v /var/run/docker.sock:/var/run/docker.sock 
        dockeragent:latest
    
    [Install]
    WantedBy=default.target
    

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 1970-01-01
      • 2016-10-02
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      相关资源
      最近更新 更多