docker run vs create + start:为什么创建的容器不同?

bas*_*her 6 docker

相关

在流程执行后停止的Detached模式中启动的docker容器

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
Run Code Online (Sandbox Code Playgroud)

然后停下来 稍后可以使用创建的容器启动

docker start silly_docker_name
Run Code Online (Sandbox Code Playgroud)

并且它将在后台运行,因为图像的入口命令是bash.

但是,首次创建容器时

docker create --name silly_name debian:testing-slim
Run Code Online (Sandbox Code Playgroud)

然后开始

docker start silly_name
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*l E 6

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

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

$ docker create --name thedate debian date

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

明确地说,您的docker run命令具有标志-dit分离交互式(连接 STDIN)和t ty 均已启用。

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

$ docker create -it --name ashell debian

现在,如果我启动它,我会要求以交互方式附加/交互到它,并且我会得到与运行相同的行为:

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

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