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 run
kon aanroepen met een container, maar dat lijkt niet toegestaan. Het gebruik van start
lijkt 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 exec
alleen 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:
-i
Houd STDIN open, zelfs als deze niet is aangesloten.-t
Wijs een pseudo-TTY toe.
Dus uw nieuwe opdracht run
is:
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/bash
gebruikt 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 commit
aan 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 commit
aan een afbeelding en deze run
met een ander commando.
Zie https://forums.docker.com/t/run-command- in-stopped-container/343
(Ik geloof dat de “ENTRYPOINT
met 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 git
op 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 run
is 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_bardeen
is 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 bash
stdin
Moet de -t
verwijderen 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 -c
gebruikt, wordt het uitvoeren van /bin/bash
onmiddellijk afgesloten in daemon-modus (-d
). Als u wilt dat deze container een interactieve shell uitvoert, gebruikt u -it
in plaats van -d
. Als je willekeurige commando’s wilt uitvoeren in een container die gewoonlijk een ander proces uitvoert, kun je nsenter
of nsinit
proberen. Kijk eens op https://blog.codecentric.de/en/ 2014/07/enter-docker-container/voor de details.
Antwoord 14
Helaas is het onmogelijk om ENTRYPOINT
te negeren met argumenten met docker run --entrypoint
om 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`