‘docker start’执行CMD命令吗?

Does 'docker start' execute the CMD command?

假设一个docker容器已经运行"docker run",然后停止运行"docker stop"。"docker start"之后会执行"cmd"命令吗?


我相信@jripoll是不正确的,它似乎也运行了第一次在docker start上使用docker run运行的命令。

下面是一个简单的测试示例:

首先创建一个shell脚本,运行名为tmp.sh

1
echo"hello yo!"

然后运行:

1
docker run --name yo -v"$(pwd)":/usr/src/myapp -w /usr/src/myapp ubuntu sh tmp.sh

这将打印hello yo!

现在重新开始:

1
docker start -ia yo

每次运行时它都会再次打印。


当您进行Docker启动时,您会调用api/client/start.go,它调用:

1
 cli.client.ContainerStart(containerID)

称为engine-api/client/container_start.go

1
cli.post("/containers/"+containerID+"/start", nil, nil, nil)

API在daemon/start.go中调用的Docker守护进程:

1
container.StartMonitor(daemon, container.HostConfig.RestartPolicy)

容器监视器在container/monitor.go中运行容器:

1
m.supervisor.Run(m.container, pipes, m.callback)

默认情况下,docker守护进程是这里的主管,在daemon/daemon.go中:

1
daemon.execDriver.Run(c.Command, pipes, hooks)

ExecDriver在daemon/execdriver/windows/exec.go中创建命令行:

1
createProcessParms.CommandLine, err = createCommandLine(processConfig, false)

daemon/execdriver/windows/commandlinebuilder.go中使用processConfig.EntrypointprocessConfig.Arguments

1
2
3
4
5
6
7
8
9
10
// Build the command line of the process
commandLine = processConfig.Entrypoint
logrus.Debugf("Entrypoint: %s", processConfig.Entrypoint)
for _, arg := range processConfig.Arguments {
    logrus.Debugf("appending %s", arg)
    if !alreadyEscaped {
        arg = syscall.EscapeArg(arg)
    }
    commandLine +="" + arg
}

那些processConfig.Arguments居住在daemon/container_operations_windows.go中:

1
2
3
4
5
6
processConfig := execdriver.ProcessConfig{
    CommonProcessConfig: execdriver.CommonProcessConfig{
        Entrypoint: c.Path,
        Arguments:  c.Args,
        Tty:        c.Config.Tty,
    },

,其中c.Args是容器的参数(runtile参数或CMD)

所以是的,"EDOCX1"(15)命令是在"EDOCX1"(1)之后执行的。


如果希望容器每次运行相同的可执行文件,那么应该考虑将ENTRYPOINTCMD结合使用。

注:不要混淆RUNCMD。run实际上运行一个命令并提交结果;CMD在构建时不执行任何操作,但为映像指定了预期的命令。

https://docs.docker.com/engine/reference/builder网站/


不,只有在执行'docker run'以运行基于映像的容器时,才会执行cmd命令。

在文档中:当在shell或exec格式中使用时,cmd指令将设置运行映像时要执行的命令。

https://docs.docker.com/reference/builder/命令