Does 'docker start' execute the CMD command?
假设一个docker容器已经运行"docker run",然后停止运行"docker stop"。"docker start"之后会执行"cmd"命令吗?
我相信@jripoll是不正确的,它似乎也运行了第一次在
下面是一个简单的测试示例:
首先创建一个shell脚本,运行名为
1 | echo"hello yo!" |
然后运行:
1 | docker run --name yo -v"$(pwd)":/usr/src/myapp -w /usr/src/myapp ubuntu sh tmp.sh |
这将打印
现在重新开始:
1 | docker start -ia yo |
每次运行时它都会再次打印。
当您进行Docker启动时,您会调用
1 | cli.client.ContainerStart(containerID) |
称为
1 | cli.post("/containers/"+containerID+"/start", nil, nil, nil) |
API在
1 | container.StartMonitor(daemon, container.HostConfig.RestartPolicy) |
容器监视器在
1 | m.supervisor.Run(m.container, pipes, m.callback) |
默认情况下,docker守护进程是这里的主管,在daemon/daemon.go中:
1 | daemon.execDriver.Run(c.Command, pipes, hooks) |
ExecDriver在
1 | createProcessParms.CommandLine, err = createCommandLine(processConfig, false) |
在
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 } |
那些
1 2 3 4 5 6 | processConfig := execdriver.ProcessConfig{ CommonProcessConfig: execdriver.CommonProcessConfig{ Entrypoint: c.Path, Arguments: c.Args, Tty: c.Config.Tty, }, |
,其中
所以是的,"EDOCX1"(15)命令是在"EDOCX1"(1)之后执行的。
如果希望容器每次运行相同的可执行文件,那么应该考虑将
注:不要混淆
https://docs.docker.com/engine/reference/builder网站/
不,只有在执行'docker run'以运行基于映像的容器时,才会执行cmd命令。
在文档中:当在shell或exec格式中使用时,cmd指令将设置运行映像时要执行的命令。
https://docs.docker.com/reference/builder/命令