Hoe voer ik een commando uit op een reeds bestaande Docker-container?

Ik heb een container gemaakt met -d, dus het is niet interactief.

docker run -d shykes/pybuilder bin/bash

Ik zie dat de container is vertrokken:

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
d6c45e8cc5f0        shykes/pybuilder:latest   "bin/bash"          41 minutes ago      Exited (0) 2 seconds ago                        clever_bardeen

Nu wil ik af en toe opdrachten op de machine uitvoeren en afsluiten. Gewoon om antwoord te krijgen.

Ik heb geprobeerd de machine te starten. Ik heb geprobeerd te koppelen. Ik dacht dat ik runkon aanroepen met een container, maar dat lijkt niet toegestaan. Het gebruik van startlijkt gewoon te werken en bestaat dan snel.

Ik wil graag teruggaan naar de interactieve modus na het afsluiten.

Ik heb geprobeerd:

docker attach d6c45e8cc5f0

Maar ik krijg:

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first

Maar als ik het start, wordt het toch afgesloten. Catch 22. Ik kan niet winnen.


Antwoord 1, autoriteit 100%

In oktober 2014 de Docker-team introduceerde opdracht docker exec: https://docs.docker.com/engine/reference/commandline/exec/

Dus nu kun je elke opdracht in een draaiende container uitvoeren, alleen wetende zijn ID (of naam):

docker exec -it <container_id_or_name> echo "Hello from container!"

Merk op dat de opdracht execalleen werkt op een reeds draaiende container. Als de container momenteel is gestopt, moet u deze eerst uitvoeren met de volgende opdracht:

docker run -it -d shykes/pybuilder /bin/bash

Het belangrijkste hier is de optie -d, wat staat voor detached. Dit betekent dat de opdracht die u aanvankelijk aan de container hebt gegeven (/bin/bash) op de achtergrond wordt uitgevoerd en dat de container niet onmiddellijk stopt.


Antwoord 2, autoriteit 51%

Uw container zal afsluitenomdat het commando dat u hem heeft gegeven zal eindigen. Gebruik de volgende opties om het live te houden:

  • -iHoud STDIN open, zelfs als deze niet is aangesloten.
  • -tWijs een pseudo-TTY toe.

Dus uw nieuwe opdracht runis:

docker run -it -d shykes/pybuilder bin/bash

Als u wilt koppelen aan een reeds draaiende container:

docker exec -it CONTAINER_ID /bin/bash

In deze voorbeelden wordt /bin/bashgebruikt als het commando.


Antwoord 3, autoriteit 26%

Dus ik denk dat het antwoord eenvoudiger is dan veel misleidende antwoorden hierboven.

Een bestaande container starten die is gestopt

docker start <container-name/ID>

Een lopende container stoppen

docker stop <container-name/ID>

Om vervolgens in te loggen op de interactieve shell van een container

docker exec -it <container-name/ID> bash

Een bestaande container starten en er in één opdracht aan koppelen

docker start -ai <container-name/ID>

Pas op, hierdoor stopt de container bij het verlaten. Maar over het algemeen moet u de container starten, bevestigen en stoppen nadat u klaar bent.


Antwoord 4, autoriteit 17%

Om het antwoord van katrmr uit te breiden, als de container is gestopt en niet kan worden gestart vanwege een fout, moet je deze commitaan een afbeelding. Dan kun je bash starten in de nieuwe afbeelding:

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image

Antwoord 5, autoriteit 7%

Sommige antwoorden hier zijn misleidend omdat ze betrekking hebben op containers die draaien, niet worden gestopt.

Sven Dowideit legde op het Docker-forum uit dat containers gebonden zijn aan hun proces (en Docker kan het proces van een gestopte container niet veranderen, schijnbaar in ieder geval vanwege de interne structuur: https://github.com/docker/docker/issues/1437). De enige optie is dus om de container commitaan een afbeelding en deze runmet een ander commando.

Zie https://forums.docker.com/t/run-command- in-stopped-container/343
(Ik geloof dat de “ENTRYPOINTmet argumenten”-aanpak ook niet zou werken, omdat je de argumenten nog steeds niet zou kunnen veranderen in een gestopte container.)


Antwoord 6, autoriteit 4%

Ik moest bash -c gebruiken om mijn commando uit te voeren:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"


Antwoord 7, autoriteit 3%

Een container maken en er één voor één commando’s naar sturen:

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

Antwoord 8

Dit is een gecombineerd antwoord dat ik heb verzonnen met behulp van het bovenstaande CDR LDN-antwoord en het antwoord dat ik vond hier.

Het volgende voorbeeld start een Arch Linux-container vanaf een afbeelding en installeert vervolgens gitop die container met behulp van de pacman-tool:

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"

Dat is alles.


Antwoord 9

Als je shellscript probeert uit te voeren, moet je het als bash uitvoeren.

docker exec -it containerid bash -c /path/to/your/script.sh

Antwoord 10

Ik wil graag opmerken dat het bovenste antwoord een beetje misleidend is.

Het probleem met het uitvoeren van docker runis dat er elke keer een nieuwe container wordt gemaakt. Er zijn echter gevallen waarin we oude containers opnieuw willen bekijken of geen ruimte innemen met nieuwe containers.

(Gegeven clever_bardeenis de naam van de gemaakte container…)

In het geval van OP, zorg ervoor dat de docker-image eerst wordt uitgevoerd door het volgende commando uit te voeren:

docker start clever_bardeen

Voer vervolgens de docker-container uit met het volgende commando:

docker exec -it clever_bardeen /bin/bash

Antwoord 11

Plaats een commando naar docker exec bashstdin

Moet de -tverwijderen om het te laten werken:

echo 'touch myfile' | sudo docker exec -i CONTAINER_NAME bash

Dit kan soms handiger zijn dan het gebruik van CLI-opties.

Getest met:

sudo docker run --name ub16 -it ubuntu:16.04 bash

dan op een andere shell:

echo 'touch myfile' | sudo docker exec -i ub16 bash

Dan op de eerste shell:

ls -l myfile

Getest op Docker 1.13.1, Ubuntu 16.04-host.


Antwoord 12

Ik gebruik meestal dit:

   docker exec -it my-container-name bash

om continu te communiceren met een draaiende container.


Antwoord 13

Ervan uitgaande dat de afbeelding het standaard toegangspunt /bin/sh -cgebruikt, wordt het uitvoeren van /bin/bashonmiddellijk afgesloten in daemon-modus (-d). Als u wilt dat deze container een interactieve shell uitvoert, gebruikt u -itin plaats van -d. Als je willekeurige commando’s wilt uitvoeren in een container die gewoonlijk een ander proces uitvoert, kun je nsenterof nsinitproberen. Kijk eens op https://blog.codecentric.de/en/ 2014/07/enter-docker-container/voor de details.


Antwoord 14

Helaas is het onmogelijk om ENTRYPOINTte negeren met argumenten met docker run --entrypointom dit doel te bereiken.

Opmerking: u kunt de ENTRYPOINT-instelling overschrijven met –entrypoint, maar
dit kan het binaire bestand alleen op exec zetten (er wordt geen sh -c gebruikt).


Antwoord 15

Voor Mac:

$ docker exec -it <container-name> sh

als je verbinding wilt maken als rootgebruiker:

$ docker exec -u 0 -it <container-name> sh

Antwoord 16

Eenvoudig antwoord: start en voeg tegelijkertijd toe. In dit geval doet u precies waar u om vroeg.

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME> 

zorg ervoor dat u <CONTAINER_ID/CONTAINER_NAME>

wijzigt


Antwoord 17

Ik gebruik Windows-container en ik moet in de docker-container kijken naar bestanden en mappen die zijn gemaakt en gekopieerd.

Om dat te doen heb ik de volgende docker entrypoint-opdracht gebruikt om de opdrachtprompt in de container te laten werken of aan de container te koppelen.

ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"]

Dat hielp me zowel om de opdrachtprompt aan container te koppelen als om de container live te houden. 🙂


Antwoord 18

# docker exec -d container_id command 

Bijvoorbeeld:

# docker exec -d xcdefrdtt service jira stop 

Antwoord 19

Een snelle manier om door te gaan en toegang te krijgen tot de meest recent afgesloten container:

docker start -a -i `docker ps -q -l`

Other episodes