2015-06-21 31 views

risposta

52

c'era un commit PR che ha aggiunto al doc:

Nota: Questo comando (attach) non è per l'esecuzione di un nuovo processo in un contenitore. Vedi: docker exec.

La risposta a "Docker. How to get bash\ssh inside runned container (run -d)?" illustra la differenza:

(finestra mobile> = 1.3) Se usiamo docker attach, possiamo usare una sola istanza di shell.
Quindi, se vogliamo aprire il nuovo terminale con nuova istanza delle coperture del contenitore, abbiamo solo bisogno di correre docker exec

se il contenitore finestra mobile è stato avviato utilizzando /bin/bash di comando, è possibile accedere utilizzando allegare, se non allora avete bisogno di esecuzione il comando per creare un'istanza di bash all'interno del contenitore usando exec.

Come menzionato in this issue:

  • Collegare non è per l'esecuzione di una cosa in più in un contenitore, è per il fissaggio al processo in esecuzione.
  • "docker exec" è specificamente per l'esecuzione di nuove cose in un contenitore già avviato, sia esso una shell o qualche altro processo.

Lo stesso problema si aggiunge:

Mentre attach non è ben nominato, in particolare a causa del comando LXC lxc-attach (che è più simile docker exec <container> /bin/sh, ma LXC specifico), si ha una specifica scopo di collegarti letteralmente al processo avviato Docker.
A seconda del processo, il comportamento potrebbe essere diverso, ad esempio il collegamento a /bin/bash fornirà una shell, ma il collegamento a redis-server sarà come se avessi appena avviato Redis direttamente senza daemonizzazione.

7

Quando un contenitore viene avviato utilizzando/bin/bash allora diventa i contenitori PID 1 e finestra mobile attach è usato per entrare PID 1 di un contenitore. Quindi docker attach < id-container> ti porterà all'interno del terminale bash in quanto è PID 1 come menzionato durante l'avvio del contenitore. L'uscita dal contenitore interromperà il contenitore.

Considerando che nel comando docker exec è possibile specificare quale shell si desidera immettere. Non ti porterà al PID 1 del contenitore. Creerà un nuovo processo per bash. finestra mobile exec -it < ID contenitore> bash. L'uscita dal contenitore non interrompe il contenitore.

È inoltre possibile utilizzare nsenter per accedere ai contenitori interni. nsenter -m -u -n -p -i -t < pid del contenitore> È possibile trovare il PID del contenitore utilizzando: finestra mobile inspect < ID contenitore> | grep PID

Nota: Se il contenitore è stato avviato con -d flag, l'uscita dal contenitore non interrompe il contenitore, sia che si usi attach o exec per entrare.