“#docker start'执行CMD命令?

时间:2014-09-25 07:26:51

标签: docker

我们假设一个docker容器已经运行了#docker run'然后停靠码头停止'。请问' CMD'在' docker start'?

之后执行命令

4 个答案:

答案 0 :(得分:14)

我认为@jripoll不正确,它似乎运行了docker run docker start上首次运行的命令。

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

首先创建一个名为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

每次运行它都会再次打印出来。

答案 1 :(得分:6)

当您启动泊坞广告时,请拨打api/client/start.go,呼叫:

 cli.client.ContainerStart(containerID)

调用engine-api/client/container_start.go

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

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

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

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

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

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

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

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

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

是的,' CMD'命令在' docker start'。

之后执行

答案 2 :(得分:0)

不,CMD命令仅在执行#docker run'时执行。运行基于图像的容器。

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

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

答案 3 :(得分:0)

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

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

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