Containerele Docker au un mod interactiv care vă permite să atașați fluxurile de intrare și ieșire ale terminalului la procesul containerului. Apăsarea Ctrl-C va termina de obicei acest lucru
proces, determinând oprirea containerului. Iată să vă detașați de o sesiune fără a opri containerul.
Desprinderea fără oprire
Docker acceptă o combinație de tastatură pentru a se detașa grațios de un container. Apăsați Ctrl-P, urmat de Ctrl-Q, pentru a vă detașa de conexiunea dvs.
Veți fi lăsat înapoi în coajă, dar procesul atașat anterior va rămâne în viață, menținând containerul în funcțiune. Puteți verifica acest lucru folosind docker ps
pentru a obține o listă de containere care rulează.
Apăsați Ctrl-C sau rulați exit
comanda va ucide, de obicei, procesul de prim-plan al containerului, cu excepția cazului în care a fost special configurat. Un container Docker trebuie să aibă un proces de prim plan în derulare; un container fără unul va intra în starea oprită.
Schimbarea secvenței de detașare a tastaturii
Puteți modifica secvența de detașare pentru a se potrivi preferințelor dvs. sau pentru a evita un conflict cu comenzile rapide de la tastatură onorate de aplicația dvs. Adauga o detachKeys
proprietate pentru ~/.docker/config.json
pentru a specifica cheile pe care doriți să le utilizați.
Docker acceptă a-z
personaje și @
, ^
, și _
, simboluri, precum și semnul paranteză stânga ([
) și două bare oblice (\
). Toate acestea sunt utilizate împreună cu Ctrl-
cheie; literele pot fi, de asemenea, utilizate individual, fără Ctrl
.
Secvențele cheie sunt exprimate ca o listă separată prin virgule:
{ "detachKeys": "Ctrl-d,d" }
Acest exemplu se va detașa de container atunci când apăsați Ctrl-D
urmat imediat de d
cheie.
Schimbarea secvenței pe o bază pe container
Dincolo de modificarea configurației dvs. globale, Docker acceptă detachKeys
suprascrie pe bază de container și per atașament. Adaugă --detach-keys
semnalizați comenzile care se pot atașa proceselor containerului pentru a seta o anumită secvență.
Comenzile care acceptă acest lucru sunt:
docker run
docker start
docker exec
docker attach
Iată cum să atașați la un container și apoi să îl utilizați Ctrl-d
, urmat de un subliniat, pentru a desprinde:
docker attach my-container --detach-keys="Ctrl-d,_"
The --detach-keys
steagul folosește același format de secvență de taste ca detachKeys
opțiunea de configurare. Drapelul îl înlocuiește docker.json
setare; la rândul său, aceasta anulează secvența Ctrl-P / Ctrl-Q implicită a lui Docker.
Desprinderea când secvența tastaturii nu va funcționa
Uneori s-ar putea să întâlniți un proces de container care refuză să se detașeze, chiar și atunci când emiteți secvența tastaturii. Acest lucru se poate întâmpla dacă fluxul de intrare al containerului nu este conectat la terminalul dvs. (-i
pavilion) sau nu are pseudo-TTY alocat (-t
steag). De asemenea, ați putea întâlni această problemă dacă procesul containerului dvs. gestionează secvența cheii de detașare și nu l-ați suprascris când ați atașat.
În aceste condiții este încă posibil să vă detașați terminalul de container. Trebuie să deschideți temporar o altă fereastră shell și să o utilizați pentru a ucide fișierul docker.attach
proces care menține atașamentul activ.
Mai întâi găsiți ID-ul procesului procesului de atașament:
ps -ef | grep attach
Utilizați ieșirea din ps
pentru a identifica docker.attach
proces pe care trebuie să-l ucizi. Comanda din CMD
coloana ar trebui să identifice atașamentul pe care îl căutați. Notați numărul PID relevant și utilizați kill
comanda de a ucide acest proces:
kill -9 <PID>
Ar trebui să vedeți carcasa originală desprinzându-se de containerul Docker și revenind la o stare normală de funcționare. Acum puteți închide al doilea shell și continuați să îl utilizați pe cel original.
Această tehnică funcționează prin eliminarea procesului CLI Docker care a atașat terminalul la container, nu procesul din container care îl menține în funcțiune. Terminalul dvs. original devine din nou utilizabil, iar containerul rămâne sus.
Reatașarea la container
Puteți reatașa containerele folosind docker attach
comanda. Aceasta atașează automat fluxurile de intrare, ieșire și eroare ale terminalului la containerul specificat:
docker attach my-container
Toate cele trei fluxuri sunt conectate în mod implicit. Puteți omite fluxul de intrare prin trecerea --no-stdin
steag. Ieșirea containerului va fi transmisă în terminal, dar nu veți putea furniza nicio intrare.
Folosiți din nou secvența tastaturii pentru a detașa sau Ctrl-C
pentru a opri procesul și containerul. Dacă folosești Ctrl-C
sau exit
, docker attach
va seta $?
variabilă în shell-ul dvs. corect, astfel încât să puteți inspecta codul de ieșire al containerului.
rezumat
Modul corect de detașare de un container Docker este o secvență de tastatură destul de obscură care te lasă înapoi în carcasă. Puteți personaliza această secvență pentru a spori memorabilitatea și a evita orice conflicte cu manipularea tastaturii containerului.
Secvențele de detașare a tastaturii pot fi ineficiente în anumite circumstanțe. Este încă posibil să se detașeze de containerul dvs. prin identificarea și uciderea procesului care susține atașamentul. Comenzi Unix obișnuite precum ps
și kill
trebuie utilizat în acest scenariu.
În cele din urmă, dacă doriți ca containerul dvs. să fie detașat permanent, porniți-l cu -d
steag (docker run -d my-image:latest
). Acest lucru va trimite containerul direct în fundal și nu va emite nicio ieșire către shell. Recipientele detașate sunt întotdeauna vizibile folosind docker ps
comandă și poate fi oprit cu docker stop my-container
.