【问题标题】:docker run vs create+start: why are created containers different?docker run vs create+start:为什么创建的容器不同?
【发布时间】:2019-03-13 14:55:44
【问题描述】:

相关

docker container started in Detached mode stopped after process execution

https://serverfault.com/questions/661909/the-right-way-to-keep-docker-container-started-when-it-used-for-periodic-tasks

我确实了解 docker runcreate + start 之间的区别,但不明白以这两种方式创建的实际容器有何不同。

假设我创建并运行一个容器

docker run -dit debian:testing-slim

然后停止它。创建的容器稍后可以启动

docker start silly_docker_name

它会在后台运行,因为图像的输入命令是 bash。

但是当第一次创建容器时

docker create --name silly_name debian:testing-slim

然后开始

docker start silly_name

然后它会立即退出。为什么 bash 没有启动,或者在这种情况下它是如何退出的?

【问题讨论】:

    标签: docker


    【解决方案1】:

    作为 shell 的容器进程(如您的 debian 示例中的 bash)的区别在于,在没有终端 + 交互式“模式”的情况下启动的 shell 不执行任何操作就退出。

    您可以通过将create'd 容器的命令更改为不需要终端的命令来测试:

    $ docker create --name thedate debian date

    现在,如果我运行 thedate 容器,每次运行它都会输出日期(在日志中)并退出。 docker logs thedate 会显示这个;每次运行一个条目。

    明确地说,您的 docker run 命令具有标志 -ditdetached、interactive(连接 STDIN)和 tty 都启用了。

    如果您想要创建和启动类似的方法,那么您需要为创建的容器分配一个tty

    $ docker create -it --name ashell debian

    现在,如果我启动它,我要求附加/交互地连接它,我得到与运行相同的行为:

    $ docker start -ai ashell root@6e44e2ae8817:/#

    注意: [2018 年 1 月 25 日] 已编辑以在 create 上添加 -i 标志作为评论者指出,正如最初所写的那样,这并没有工作,因为容器元数据在创建阶段没有连接标准输入

    【讨论】:

    • 谢谢哥们。不知道-t 标志也可用于create
    • -1;这对我来说很简单。如果我先看docker create -t --name ashell debian,然后再看docker start -ai ashell,我确实看到了root@6e44e2ae8817:/#,但外壳挂了;它不会接受输入或显示任何进一步的输出。另一方面,如果我用docker run -dit --name ashell debian 替换docker create 命令,则一切正常。对我来说,这些命令为何不同的谜团仍未解开。
    • 我将命令翻译成答案的错误; -i 标志在 create 步骤中仍然需要,以便 stdin 在开始时连接,因为它存在于为容器创建的元数据中。我已经编辑了答案,现在可以正确显示。
    • @PhilE 你确定在start 上需要-ai 吗?当我做docker start -i container 时,我得到与docker start -ai container 相同的结果。或者有什么区别?
    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2017-03-06
    • 2023-01-22
    • 1970-01-01
    相关资源
    最近更新 更多