代码之家  ›  专栏  ›  技术社区  ›  Chris R

停靠站容器名已在使用中

  •  0
  • Chris R  · 技术社区  · 7 年前

    我有一个詹金斯的工作,用最新的图像替换码头集装箱过夜。通常情况下,这是可行的,但有时会失败,并出现错误:

    docker: Error response from daemon: Conflict. The container name "/demo-api" is already in use by container
    

    jenkins作业使用以下内容:

    docker stop demo-api
    ./api_container.sh
    

    api_container.sh 做一个 docker pull docker run --name demo-api -t -d --rm .

    但是当我 ssh 在一次失败后的早晨 docker ps 容器不再运行,所以看起来它最终确实停止了,只是没有及时 docker run 尝试用新图像启动它的命令。

    问题
    docker stop 命令在返回之前不阻塞?
    我应该在詹金斯的工作剧本中用不同的方式来处理这个问题吗?
    我看到还有一个 docker wait 命令。我应该在我的剧本里也用这个吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   BMitch    7 年前

    很肯定你有比赛条件。停止将在 --rm 生效。所以这是一场 ——RM 由发动机和 api_container.sh 脚本。

    我会用一个明确的 docker rm 为了避免比赛。注意 删除容器 可能会失败,取决于 ——RM 在处理过程中,我会小睡片刻以确保完成。

    docker stop demo-api
    docker rm demo-api || sleep 5
    ./api_container.sh
    

    或者你可以换成 docker rm -f 这将在一个步骤中杀死和删除容器。可能是您真正想要的,而且不太容易出错,但是如果应用程序死机不正常,可能会使卷处于不好的状态。

    docker rm -f demo-api
    ./api_container.sh
    
        2
  •  0
  •   mchawre    7 年前

    docker stop 会阻止你的集装箱。

    在此命令中可以找到所有已停止的容器。

    docker ps --filter "status=exited

    你犯的错误说明 The container name "/demo-api" is already in use by container

    这意味着已经有一个容器在使用 demo-api 名称,这是真的,因为停止Docker容器不会删除该容器,并且该容器名称将存在。

    你要做的就是

    任何一个

    docker run 不指定的命令 --name 为容器命名的选项 演示API . 因此,每次脚本拉取并运行容器时,它将获得一个新的随机容器名称。

    如果您想保持容器名称不变 演示API 而不是停止容器使用 停止容器 把容器一起搬走 docker rm -f demo-api

    更新

    我刚看到你更新了你的问题。

    停止使用 --rm 选项应该删除 集装箱都在一起。

    您得到的错误似乎只在名称已被另一个容器使用时存在。

    到目前为止,您可以尝试在while循环中运行脚本,并检查在运行期间是否发生这种情况。

    这是我使用的脚本(但没有出现任何问题),请在出现此问题的特定计算机上尝试此操作。

    #!/bin/bash
    i=20
    while [ $i -gt 0 ]
    do
    docker stop demo-api
    docker pull alpine
    docker run --name demo-api -t -d --rm alpine sh
    i=$((i - 1))
    done
    
    推荐文章