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ć.
 340
Author: Peter Mortensen, 2014-10-02

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 .

 400
Author: Scadge,
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.

 248
Author: cdrev,
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
 80
Author: Aaron V,
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
 62
Author: Peter T.,
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.)

 37
Author: katrmr,
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"

 13
Author: velop,
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
 12
Author: stackoverflowwww,
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.
 6
Author: imriss,
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.

 2
Author: Andreas Steffan,
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).

 2
Author: wieczorek1990,
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.

 1
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
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>

 0
Author: user353305,
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