Jak uruchomić polecenie na już istniejącym kontenerze dokera?
Stworzyłem kontener za pomocą -d
, więc nie jest interaktywny.
docker run -d shykes/pybuilder bin/bash
Widzę, że kontener wyszedł:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
Teraz chciałbym uruchomić sporadyczne polecenia na maszynie i zakończyć. Tylko po to, żeby uzyskać odpowiedź.
Próbowałem uruchomić maszynę. Próbowałem się przyłączyć. Myślałem, że mogę zadzwonićrun
za pomocą kontenera, ale to chyba nie jest dozwolone. Używanie start
wydaje się działać, a następnie szybko istnieć.
[7]} chciałbym wrócić do trybu interaktywnego po wychodzę.
Próbowałem:
docker attach d6c45e8cc5f0
Ale dostaję:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Ale jeśli zacznę, to i tak wyjdzie. Łap 22. Nie mogę wygrać. 12 answers
W październiku 2014 roku zespół Docker wprowadził docker exec
dowództwo: https://docs.docker.com/engine/reference/commandline/exec/
Więc teraz możesz uruchomić dowolne polecenie w uruchomionym kontenerze, znając jego ID (lub nazwę):
docker exec -it <container_id_or_name> echo "Hello from container!"
Zauważ, że polecenie exec
działa tylko na już uruchomionym kontenerze. Jeśli kontener jest aktualnie zatrzymany, musisz najpierw uruchomić go za pomocą następującego polecenia:
docker run -it -d shykes/pybuilder /bin/bash
Najważniejszą rzeczą jest tutaj opcja -d
, która oznacza detached
. Oznacza to, że polecenie początkowo dostarczone do kontenera (/bin/bash
) zostanie uruchomione w tle i kontener nie zatrzyma się natychmiast .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 15:48:17
Twój kontener zakończy się , gdy Komenda, którą podałeś, zakończy się. Użyj następujących opcji, aby utrzymać go na żywo:
-
-i
trzymaj STDIN otwarte, nawet jeśli nie jest dołączone. -
-t
Przydziel pseudo-TTY.
Więc twoje nowe polecenie run
to:
docker run -it -d shykes/pybuilder bin/bash
Jeśli chcesz dołączyć do już działającego kontenera:
docker exec -it CONTAINER_ID /bin/bash
W tych przykładach {[5] } jest używane jako polecenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-01 20:10:51
Aby rozwinąć odpowiedź katrmr, jeśli kontener zostanie zatrzymany i nie może zostać uruchomiony z powodu błędu, musisz commit
umieścić go na obrazie. Następnie możesz uruchomić Basha na nowym obrazku:
docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-03 17:25:12
Więc myślę, że odpowiedź jest prosta niż wiele mylących odpowiedzi powyżej.
Aby uruchomić istniejący kontener, który jest zatrzymany
docker start <container-name/ID>
Aby zatrzymać uruchomiony kontener
docker stop <container-name/ID>
Następnie zaloguj się do interaktywnej powłoki kontenera
docker exec -it <container-name/ID> bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 10:15:05
Niektóre odpowiedzi są mylące, ponieważ dotyczą kontenerów, które są uruchomione, a nie zatrzymane.
Sven Dowideit wyjaśnił na forum Dockera, że kontenery są powiązane z ich procesem (a Docker nie może zmienić procesu zatrzymanego kontenera, pozornie ze względu na jego wewnętrzną strukturę: https://github.com/docker/docker/issues/1437 ). więc, w zasadzie jedyną opcją jest commit
kontener do obrazu i {[1] } to z innym poleceniem.
Zobacz https://forums.docker.com/t/run-command-in-stopped-container/343
(Wierzę, że podejście "ENTRYPOINT
with arguments " również nie zadziała, ponieważ nadal nie będzie można zmienić argumentów na zatrzymany kontener.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-30 23:38:29
Musiałem użyć bash-c, aby uruchomić moje polecenie:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-25 14:29:38
Tworzenie kontenera i wysyłanie do niego poleceń, jeden po drugim:
docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 13:36:50
Jest to połączona odpowiedź, którą wymyśliłem używając odpowiedzi CDR LDN powyżej i odpowiedzi, którą znalazłem tutaj .
Poniższy przykład uruchamia kontener Arch Linux z obrazu, a następnie instaluje git
na tym kontenerze za pomocą narzędzia pacman
:
sudo docker run -it -d archlinux /bin/bash
sudo docker ps -l
sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"
To wszystko.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 17:24:53
Zakładając, że obraz używa domyślnego punktu wejścia /bin/sh -c
, uruchomienie /bin/bash
zakończy się natychmiast w trybie demona (-d
). Jeśli chcesz, aby kontener uruchamiał interaktywną powłokę, użyj -it
zamiast -d
. Jeśli chcesz wykonać dowolne polecenia w kontenerze Zwykle wykonującym inny proces, możesz spróbować nsenter
lub nsinit
. Zobacz https://blog.codecentric.de/en/2014/07/enter-docker-container / dla szczegółów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-02 07:38:13
Niestety nie jest możliwe nadpisanie ENTRYPOINT
argumentami z docker run --entrypoint
aby osiągnąć ten cel.
Uwaga: możesz nadpisać ustawienie ENTRYPOINT używając --entrypoint, ale to moĹźe tylko ustawiÄ ‡ binarny na exec (nie bÄ ™ dzie uĺźywane sh-c).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 13:34:46
Przełącz polecenie na stdin
Musi usunąć -t
, aby zadziałało:
echo 'touch myfile' | sudo docker exec -i CONTAINER_NAME bash
Może to być wygodniejsze niż korzystanie z opcji CLI czasami.
Sprawdzone przez:
sudo docker run --name ub16 -it ubuntu:16.04 bash
Potem na innej powłoce:
echo 'touch myfile' | sudo docker exec -i ub16 bash
Następnie na pierwszej powłoce:
ls -l myfile
Na Docker 1.13.1, Ubuntu 16.04 host.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-13 13:10:52
Prosta odpowiedź: Uruchom i dołącz w tym samym czasie. W tym przypadku robisz dokładnie to, o co prosiłeś.
docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME>
Upewnij się, że zmienisz <CONTAINER_ID/CONTAINER_NAME>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 19:21:18