2014-09-25 6 views
6

मान लें कि एक डॉकर कंटेनर 'डॉकर रन' के साथ चलाया गया है और फिर 'डॉकर स्टॉप' के साथ रुक गया है। 'डॉकर स्टार्ट' के बाद 'सीएमडी' कमांड को निष्पादित किया जाएगा?क्या 'डॉकर स्टार्ट' सीएमडी कमांड निष्पादित करता है?

+1

चेक इस सवाल: (http://stackoverflow.com/q/21553353/4677231) समझने के लिए महान 'CMD',' ENTRYPOINT [सीएमडी और ENTRYPOINT एक Dockerfile में क्या अंतर है?] ' – sEpmein

उत्तर

6

मेरा मानना ​​है कि @jripoll गलत है, यह आदेश है कि docker start पर docker run साथ पहली बार चलाने था भी चलाने के लिए प्रकट होता है।

यहां परीक्षण का एक सरल उदाहरण है:

पहले एक खोल स्क्रिप्ट बनाने 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 

यह इसे फिर से हर बार जब आप कि चलाने के प्रिंट होगा।

0

नहीं, सीएमडी कमांड केवल तभी निष्पादित होता है जब आप किसी छवि में स्थित कंटेनर चलाने के लिए 'डॉकर रन' निष्पादित करते हैं।

प्रलेखन में: जब खोल या कार्यकारी स्वरूपों में इस्तेमाल किया, अध्यक्ष एवं प्रबंध निदेशक अनुदेश सेट किए जाने पर छवि चल कमांड निष्पादित किया जाना है।

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

3

जब आप एक डोकर शुरू करते हैं, आप 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 में API कॉल:

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

कंटेनर मॉनिटर 012 में कंटेनर चलाता है:

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

डिफ़ॉल्ट रूप से, डोकर डेमॉन पर्यवेक्षक यहां, daemon/daemon.go में है:

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

और execDriver daemon/execdriver/windows/exec.go में कमांड लाइन बनाता है:

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

कि का उपयोग करता है processConfig.EntrypointऔरprocessConfig.Argumentsdaemon/execdriver/windows/commandlinebuilder.go में : c.Args जा रहा है एक कंटेनर के तर्कों (runtile पैरामीटर या CMD)

तो हाँ, 'CMD के आदेशों का कर रहे हैं के साथ

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

,:

// 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.Argumentsdaemon/container_operations_windows.go में भर जाती है 'docker start' के बाद निष्पादित किया गया।

0

यदि आप अपने कंटेनर को हर बार एक ही निष्पादन योग्य चलाने के लिए चाहते हैं, तो आपको ENTRYPOINTCMD के साथ संयोजन में उपयोग करना चाहिए।

नोट: RUNCMD के साथ भ्रमित न करें। रन वास्तव में एक आदेश चलाता है और परिणाम देता है; CMD बिल्ड समय पर कुछ भी निष्पादित नहीं करता है, लेकिन छवि के लिए इच्छित आदेश निर्दिष्ट करता है।

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

संबंधित मुद्दे