2014-09-25 27 views
6

Załóżmy, że kontener dokera został uruchomiony z "dokiem dokowanym", a następnie zatrzymany z "zatrzymaniem dokowania". Czy polecenie "CMD" zostanie wykonane po "rozpoczęciu dokowania"?Czy "uruchamianie okna dokowanego" wykonuje polecenie CMD?

+1

Sprawdź to pytanie: [Co to jest różnica między CMD i punkt_wejścia w Dockerfile?] (Http://stackoverflow.com/q/21553353/4677231) Doskonały do ​​zrozumienia 'CMD',' punkt_wejścia ' – sEpmein

Odpowiedz

6

wierzę @jripoll jest błędne, wydaje się, aby uruchomić polecenie, które było pierwszym uruchomieniu z docker run na docker start też.

Oto prosty przykład do testu:

Najpierw utwórz skrypt do uruchomienia zwany tmp.sh:

echo "hello yo!" 

Następnie uruchom:

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

To będzie drukować hello yo!.

Teraz uruchom go ponownie:

docker start -ia yo 

Będzie go wydrukować ponownie przy każdym uruchomieniu tego.

0

Nie, polecenie CMD zostało wykonane tylko po uruchomieniu operacji dokowania, aby uruchomić kontener oparty na obrazie.

W dokumentacji: W przypadku użycia w formatach powłoki lub exec, instrukcja CMD ustawia polecenie, które ma zostać wykonane, gdy wyświetla obraz.

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

3

Kiedy robisz start Döcker, zadzwonić api/client/start.go, który wzywa:

cli.client.ContainerStart(containerID) 

To nazywa engine-api/client/container_start.go:

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

Proces demon doker że wywołanie API w daemon/start.go:

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

Monitor kontenera uruchamia kontener w container/monitor.go:

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

Domyślnie demon doker jest przełożony tutaj, w daemon/daemon.go:

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

A execDriver tworzy wiersz polecenia w daemon/execdriver/windows/exec.go:

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

który wykorzystuje processConfig.EntrypointiprocessConfig.Arguments w daemon/execdriver/windows/commandlinebuilder.go :

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

Ci ProcessConfig.Arguments są wypełniane w daemon/container_operations_windows.go:

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

z c.Args będąc argumenty pojemnik (parametry runtile lub CMD)

Więc tak, że 'CMD' polecenia są wykonane po "docker start".

0

Jeśli chcesz, aby twój kontener uruchamiał za każdym razem ten sam plik wykonywalny, powinieneś rozważyć użycie ENTRYPOINT w połączeniu z CMD.

Uwaga: nie mylić RUN z CMD. RUN faktycznie uruchamia polecenie i zatwierdza wynik; CMD nie wykonuje niczego podczas kompilacji, ale określa zamierzone polecenie dla obrazu.

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

Powiązane problemy