Naiwnie spodziewałem się, że to polecenie uruchomi powłokę bash w działającym kontenerze:
docker run "id of running container" /bin/bash
wygląda na to, że to niemożliwe, pojawia się błąd:
2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
Więc jeśli chcę uruchomić powłokę bash w działającym kontenerze (np. Do celów diagnostycznych)
czy muszę na nim uruchomić serwer SSH i zalogować się przez ssh?
docker run CONTAINER
planowane jest na 1.0docker attach container_name
Odpowiedzi:
EDYCJA: Teraz możesz użyć
docker exec -it "id of running container" bash
( doc )Wcześniej odpowiedź na to pytanie brzmiała:
Jeśli naprawdę musisz i jesteś w środowisku debugowania, możesz to zrobić:
sudo lxc-attach -n <ID>
Zauważ, że identyfikator musi być pełny (docker ps -notrunc
).Jednak zdecydowanie odradzam to.
Uwaga:
-notrunc
jest przestarzałe, wkrótce zostanie zastąpione przez--no-trunc
.źródło
lxc-attach
powinien działać dobrze. Właśnie dwukrotnie sprawdziłem i to działa dla mnie. (Pamiętaj, że nie będzie działać z jądrem wcześniejszym niż 3.8).docker -d -e lxc
docker run -v /var/log/nginx -name somename imagename command
; 2) uruchomienia innego pojemnika, aby zobaczyć zawartość objętościowa produktu:docker run -volumes-from somename -i -t busybox /bin/sh
.W dokerze 1.3 pojawiło się nowe polecenie
docker exec
. Umożliwia to wejście do działającego okna dokowanego:źródło
docker ps
aby uzyskać identyfikator uruchomionych instancjidocker inspect <image>
aby zobaczyć, jaka powłoka jest dostępna. Np. Uruchomdocker exec -it <container id> /bin/sh
zamiast tego.Po prostu zrób
Jak wspomniano w komentarzach, aby odłączyć się od pojemnika bez zatrzymywania go, wpisz Ctrlpnastępnie Ctrlq.
źródło
docker attach container_name
użyjctrl p
ictrl q
zamiastexit
.exit
polecenie zatrzymuje kontener, gdzie jakctrlp
ictrl q
po prostu odłącza ten kontener i utrzymuje go w działaniuPonieważ wszystko się zmienia, w tej chwili używa się zalecanego sposobu dostępu do działającego kontenera
nsenter
.Możesz znaleźć więcej informacji na temat tego repozytorium github . Ale ogólnie możesz użyć nsenter w ten sposób:
lub możesz użyć opakowania
docker-enter
:Dobre wyjaśnienie na ten temat można znaleźć na blogu Jérôme Petazzoni: Dlaczego nie musisz uruchamiać sshd w kontenerach dokerów
źródło
source /proc/*/environ
.Pierwsza rzecz, której nie możesz uruchomić
Ponieważ to polecenie oczekuje obrazu, a nie kontenera, i tak spowoduje powstanie nowego kontenera (więc nie tego, na który chciałeś spojrzeć)
Zgadzam się z faktem, że dzięki dokerowi powinniśmy zmuszać się do myślenia w inny sposób (więc powinieneś znaleźć sposoby, aby nie trzeba było logować się do kontenera), ale nadal uważam to za przydatne i tak działam dookoła tego.
Uruchamiam polecenia za pośrednictwem opiekuna w trybie DEAMON.
Następnie wykonuję to, co nazywam
docker_loop.sh
. Treść jest prawie taka:Umożliwia to „dołączenie” do kontenera i przedstawienie
supervisorctl
interfejsu umożliwiającego zatrzymanie / uruchomienie / ponowne uruchomienie i sprawdzenie dzienników. Jeśli to nie wystarczy, możeszCtrl+D
i wpadniesz do powłoki, która pozwoli ci rzucić okiem, jakby to był normalny system.PROSZĘ RÓWNIEŻ UWAŻAĆ, że ten system nie jest tak bezpieczny, jak posiadanie pojemnika bez skorupy, więc podejmij wszelkie niezbędne kroki, aby zabezpieczyć swój kontener.
źródło
Obserwuj tę prośbę: https://github.com/docker/docker/pull/7409
Który implementuje nadchodzące
docker exec <container_id> <command>
narzędzie. Gdy jest to możliwe, powinno być możliwe np. Uruchomienie i zatrzymanie usługi ssh w działającym kontenerze.Należy również
nsinit
to zrobić: „nsinit zapewnia wygodny sposób na uzyskanie dostępu do powłoki wewnątrz działającego obszaru nazw kontenera” , ale uruchomienie jest trudne. https://gist.github.com/ubergarm/ed42ebbea293350c30a6źródło
docker exec
wylądował w Döcker 1.3, więc jest obecnie możliwe, aby utworzyć i dołączyć nową sesję powłoki w pojemniku z systememMożesz użyć
źródło
W rzeczywistości istnieje sposób na umieszczenie powłoki w pojemniku.
Załóżmy, że
/root/run.sh
uruchamia proces, kierownika procesu (przełożonego) lub cokolwiek innego.Twórz za
/root/runme.sh
pomocą kilku sztuczek na ekranie GNU:Teraz masz demony na karcie 0 i interaktywną powłokę na karcie 1.
docker attach
w dowolnym momencie, aby zobaczyć, co dzieje się w pojemniku.Inną radą jest utworzenie obrazu „pakietu rozwojowego” na górze obrazu produkcyjnego przy użyciu wszystkich niezbędnych narzędzi, w tym tej sztuczki ekranowej.
źródło
oto moje rozwiązanie
część DOckerfile:
część „initd.sh”
po zbudowaniu obrazu masz dwie opcje za pomocą exec i attach:
uruchomienie dokera - nazwa $ CONTAINER_NAME -dt $ IMAGE_NAME
następnie
docker exec -it $ CONTAINER_NAME / bin / bash
I użyć
CTRL + D, aby odłączyć
Uruchom okno dokowane - nazwa $ CONTAINER_NAME -dit $ IMAGE_NAME
następnie
doker dołącza $ CONTAINER_NAME
I użyć
CTRL + P i CTRL + Q, aby odłączyć
różnica między opcjami jest w parametrze -i
źródło
Istnieją dwa sposoby.
Z załącznikiem
Z exec
źródło
Jeśli celem jest sprawdzenie dzienników aplikacji, ten post pokazuje uruchamianie tomcat i dostosowywanie dziennika w ramach CMD. Dziennik tomcat jest dostępny na hoście przy użyciu „docker logs containerid”.
http://blog.trifork.com/2013/08/15/using-docker-to-fficiently-create-multiple-tomcat-instances/
źródło
Przydatne jest przypisanie nazwy podczas uruchamiania kontenera. Nie musisz odwoływać się do id_kontenera.
docker run --name container_name yourimage docker exec -it container_name bash
źródło
najpierw uzyskaj identyfikator kontenera żądanego kontenera przez
dostaniesz coś takiego:
teraz skopiuj ten identyfikator kontenera i uruchom następującą komendę:
źródło
Być może przy wprowadzaniu kontenerów wprowadzono Cię w błąd, podobnie jak ja, do myślenia o maszynach wirtualnych. Moja rada: staraj się tego nie robić.
Pojemniki są jak każdy inny proces. Rzeczywiście możesz chcieć „dołączyć” do nich w celu debugowania (pomyśl o / proc // env lub strace -p), ale to bardzo szczególny przypadek.
Zwykle po prostu „uruchamiasz” ten proces, więc jeśli chcesz zmodyfikować konfigurację lub odczytać dzienniki, po prostu utwórz nowy kontener i upewnij się, że zapisujesz dzienniki poza nim, udostępniając katalogi, pisząc na standardowe wyjście (aby dzienniki dokera działały) czy jakoś tak.
Do celów debugowania możesz chcieć uruchomić powłokę, potem swój kod, a następnie naciśnij CTRL-p + CTRL-q, aby pozostawić powłokę nietkniętą. W ten sposób możesz ponownie podłączyć, używając:
Jeśli chcesz debugować kontener, ponieważ robi coś, czego się nie spodziewałeś, spróbuj go debugować: /server/596994/how-can-i-debug-a-docker-container -inicjalizacja
źródło
Nie. Nie jest to możliwe. Użyj czegoś takiego,
supervisord
aby uzyskać serwer ssh, jeśli jest to potrzebne. Chociaż zdecydowanie kwestionuję tę potrzebę.źródło