“docker启动”执行CMD命令吗?

比方说一个docker集装箱已经运行'docker运行',然后停止'docker停止'。 在“docker启动”后执行“CMD”命令吗?

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

这里有一个简单的例子来testing:

首先创build一个名为tmp.sh的shell脚本:

 echo "hello yo!" 

然后运行:

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

那会打印hello yo!

现在再次启动它:

 docker start -ia yo 

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

当你启动api/client/start.go ,你可以调用api/client/start.go ,它调用:

  cli.client.ContainerStart(containerID) 

这就是调用engine-api/client/container_start.go

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

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

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

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

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

默认情况下, docker守护进程是daemon / daemon.go中的主pipe 。

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

execDriver在daemon/execdriver/windows/exec.go创build命令行:

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

daemon/execdriver/windows/commandlinebuilder.go使用processConfig.Entrypoint processConfig.Arguments

 // 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

 processConfig := execdriver.ProcessConfig{ CommonProcessConfig: execdriver.CommonProcessConfig{ Entrypoint: c.Path, Arguments: c.Args, Tty: c.Config.Tty, }, 

c.Args是Container的参数(runtile参数或CMD

所以是的,' docker start '后执行' CMD '命令。

不,只有在执行“docker run”才能运行基于映像的容器时,才会执行CMD命令。

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

https://docs.docker.com/reference/builder/#cmd

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

注意:不要将RUNCMD混淆。 RUN实际上运行一个命令并提交结果; CMDCMD不执行任何操作,但指定了图像的预期命令。

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