【问题标题】:How to continue a Docker container which has exited如何继续已退出的 Docker 容器
【发布时间】:2014-03-22 15:05:32
【问题描述】:

考虑:

docker run -it centos /bin/bash

我按 Ctrl+D 退出。

我想继续运行这个容器,但我发现我不能。

唯一的方法是

docker commit `docker ps -q -l` my_image
docker run -it my_image /bin/bash

我说的对吗?有没有更好的方法? (我使用的是 docker 0.8.0。)

【问题讨论】:

  • 您是否尝试为容器分配一个名称,并使用该名称来控制它?顺便说一句,“退出”是指脱离它,对吧?
  • Docker一个编程工具,至少我是这么用的。如果大多数人不同意,那么应该有人告诉 Docker 不要指向 StackOverflow 作为提问的地方。我敢肯定这不是第一个可以在这里或 SuperUser 提出的类似“DevOps”的问题。
  • Docker 是一个开发工具。这里已经是一个 'docker' 标签。所以,我认为在stackoverflow中询问是合适的。我用它来构建需要从干净环境构建的图像。
  • 我希望将其标记为“离题”的人能解释原因!

标签: docker


【解决方案1】:

您可以在现有容器退出后重新启动它,并且您的更改仍然存在。

docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin

【讨论】:

  • 简述为一行:docker start `docker ps -q -l` && docker attach `docker ps -q -l`
  • 简述为一行:docker start -i $(docker ps -q -l)。 ;-) 命名可以帮助更好地控制选择哪个容器。 -l拿到最后一个,ok...
  • 对于 Linux 新手来说,`docker ps -q -l` 位是一个扩展。它将被创建的最后一个 (-l) docker 容器的 id 替换。 -q 仅抑制通常由`docker ps` 输出的其他信息(除了id)。 ---- 注意: 反引号不是引号,它有很特殊的含义。您在反引号之间键入的所有内容都会在主命令之前由 shell 评估(执行) - unix.stackexchange.com/questions/27428/…
  • 我发现容器进入了一个名为Created... 的状态,无法使用docker start ... 启动它。但是可以使用docker restart ... 重新启动它
  • 注意:-l 只获取“最新”的 docker。如果您像我一样并且docker ps -a 显示了您需要启动的不止一件事,那么您可以通过将上面的命令更改为docker start `docker ps -q -a` 来重新启动它们中的“全部”(-a)。 -q 只是让它“安静”(不输出日志)。
【解决方案2】:
docker start -a -i `docker ps -q -l`

解释:

docker start 启动容器(需要名称或 ID)
-a 附加到容器
-i 交互模式
docker ps 列出容器
-q 仅列出容器 ID
-l 仅列出最后创建的容器

【讨论】:

  • docker ps -q -l, 它给出最后创建的容器ID,即使它处于启动状态。
  • 什么是所谓的“附加”到容器? “附加”?
  • @skytree attach 用于将您的 STDIO 标准输入和输出附加到您正在启动的容器。基本上是发送击键。
【解决方案3】:

用途:

docker start $(docker ps -a -q --filter "status=exited")

这将启动所有处于退出状态的容器。

docker exec -it <container-id> /bin/bash

这将连接到特定的容器。

【讨论】:

  • 我发现这是唯一对我有用的..由于关键的第二行。 docker exec -it &lt;container id&gt; /bin/bash(或只是 bash)。
  • 这对我有用,但我不得不运行它两次,因为我有两个容器。因此,如果第一个启动并且第二个出现错误。只需再次点击相同的命令,它应该会启动下一个容器。
【解决方案4】:

如果您想使用多个易于记忆的命令来执行此操作:

  1. 列出停止的容器:

docker ps -a

  1. 复制您要附加到的容器的名称或容器 ID,然后使用以下命令启动容器:

docker start -i &lt;name/id&gt;

-i 标志告诉 docker 附加到容器的标准输入。

如果容器不是通过交互式 shell 启动来连接的,则需要执行以下操作来运行 shell:

docker start <name/id>
docker exec -it <name/id> /bin/sh

/bin/sh 是通常可用于基于 alpine 的图像的 shell。

【讨论】:

  • 被低估的答案,这帮助我找到了我正在寻找的容器,这比这个问题的“答案”要容易得多。
  • Error response from daemon: Container &lt;id&gt; is not running
【解决方案5】:

如果你想继续使用一个已知名称的 Docker 容器:

docker start  `docker ps -a -q --filter "name=elas"`

【讨论】:

  • 感谢@Nelson,这对我启动特定的 docker 非常有帮助
  • 在这种情况下,您只需运行 docker start &lt;name&gt; 其中 是您的容器的名称。至少使用 docker v19.03.8
【解决方案6】:

按照以下步骤操作:

  1. 运行以下命令以查看所有容器服务是否正在运行和停止。提供选项-a 以查看容器也停止

    docker ps -a
    
  2. 然后通过 container_id 或容器标签名称启动 docker 容器

    docker start <CONTAINER_ID> or <NAMES>
    

    从上图说,容器id 4b161b302337
    所以要运行的命令是

    docker start 4b161b302337
    
  3. 可以验证容器是否正在运行

    docker ps
    

【讨论】:

    【解决方案7】:

    如果你有一个命名容器,那么它可以通过运行来启动

    docker container start container_name
    

    其中 container_name 是容器的名称,必须在创建容器时给出。如果容器未命名,您可以将 container_name 替换为容器 ID。容器ID可以通过运行找到:

    docker ps -a
    

    【讨论】:

      【解决方案8】:

      这些命令适用于任何容器(不仅是最后退出的容器)。 即使在您的系统重新启动后,这种方式也将起作用。 为此,这些命令将使用“容器 ID”。

      步骤:

      1. 使用此命令列出所有 docker 并记下要重新启动的容器的容器 ID: docker ps -a

      2. 使用容器 ID 启动容器: docker start &lt;container_id&gt;

      3. 附加并运行您的容器: docker attach &lt;container_id&gt;

      注意:在 linux 上工作

      【讨论】:

        【解决方案9】:

        按名字

        sudo docker start bob_the_container
        

        或按 ID

        sudo docker start aa3f365f0f4e
        

        这会重新启动停止的容器,使用 -i 附加容器的 STDIN 或者代替 -i 您可以附加到容器会话(如果您使用 -it 运行)

        sudo docker attach bob_the_container
        

        【讨论】:

          【解决方案10】:

          使用 --privileged 标志运行您的容器。

          docker run -it --privileged ...
          

          【讨论】:

          • 很好的发现。 --privileged 选项似乎在原始运行退出后保留容器。也有助于让“--name myName”让“docker start ...”和“docker exec ...”命令起作用。
          【解决方案11】:

          如果您只想启动状态为“已退出”的容器,只需键入:

          sudo docker start container_name
          

          没有 sudo。 See more

          docker start container_name
          

          如果容器名称不起作用,请将名称替换为容器 id

          【讨论】:

            【解决方案12】:
            docker start `docker ps -a | awk '{print $1}'`
            

            这将启动所有处于“退出”状态的容器

            【讨论】:

              【解决方案13】:

              对于那些在 2021 年及以后来到这里的人,以下命令将执行接受的答案将在一行中执行的操作。

              $ docker start -ai $(docker ps -q -l)
              

              【讨论】:

                【解决方案14】:

                在我的情况下,当我启动 docker 容器时,它会干净地退出,所以上述方法都不起作用。我需要的是一种更改要运行的命令的方法。

                使用 docker-compose 我可以通过运行来更改命令:

                docker-compose run <container name in docker-compose.yml> bash
                

                例如

                docker-compose run app bash
                

                注意!这实际上是重新创建容器,因此它不会在前一个实例上运行。

                【讨论】:

                  猜你喜欢
                  • 2018-02-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-11-01
                  • 2021-07-26
                  • 2015-04-30
                  • 2019-02-09
                  • 2019-09-26
                  • 2017-05-20
                  相关资源
                  最近更新 更多