我们假设一个docker容器已经运行了#docker run'然后停靠码头停止'。请问' CMD'在' docker start'?
之后执行命令答案 0 :(得分:14)
我认为@jripoll不正确,它似乎运行了docker run
docker start
上首次运行的命令。
以下是一个简单的测试示例:
首先创建一个名为tmp.sh
:
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指令设置在运行映像时要执行的命令。
答案 3 :(得分:0)
如果您希望容器每次都运行相同的可执行文件,那么您应该考虑将ENTRYPOINT
与CMD
结合使用。
注意:请勿将RUN
与CMD
混淆。 RUN实际上运行一个命令并提交结果; CMD
在构建时不执行任何操作,但指定了图像的预期命令。