Vraag Hoe kan ik CMD overschrijven bij het uitvoeren van een docker-afbeelding?


Ik wil een docker-afbeelding inspecteren die is gemaakt door iemand anders met zowel een opgegeven ingangspunt als een cmd, bijvoorbeeld:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Ik doe momenteel:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

Is er een manier om CMD te negeren om leeg te zijn (dus ik hoef geen "--login" te gebruiken)?


82
2018-05-10 12:59


oorsprong




antwoorden:


Je zou gewoon via kunnen komen docker run -it --entrypoint=/bin/bash $IMAGE -i (u lanceert een nieuwe container uit de afbeelding en krijgt een bash-shell in de interactieve modus) en voert vervolgens de opdracht entrypoint uit in die container.

U kunt dan de lopende container inspecteren in de staat waarin deze zou moeten draaien.

EDIT: Sinds Docker 1.3 die u kunt gebruiken exec om een ​​proces in een actieve container uit te voeren. Start uw container zoals u dat normaal zou doen en voer het in door het volgende uit te geven:

docker exec -it $CONTAINER_ID /bin/bash

Ervan uitgaande dat bash is geïnstalleerd, krijgt u shell-toegang tot de actieve container.


90
2018-05-12 09:28



Zou dat niet "/ usr / sbin / apache2ctl / bin / bash" uitvoeren? (omdat uw voorbeeld niet het entrypoint overschrijft, wordt het ingangspunt gebruikt dat is gedefinieerd in het Docker-bestand - of mis ik iets?) - warp
Is dat iets dat anders is voor oudere / nieuwere docker-versies misschien? Het voert zeker het entrypoint voor mij uit: gist.github.com/warpr/26a5cc471dce7fcf9021 . Dit gebruikt docker 0.10.0 op Ubuntu 13.10. - warp
Passing -entrypoint overschrijft het ingangspunt. Zie het bewerkte antwoord - Panagiotis Moustafellos
Ik weet dat passeren - centraal punt overschrijft het ingangspunt. Maar wanneer ik - centraal punt, hoe overschrijf ik CMD om leeg te zijn? (Voor bash kan ik zoiets als -i of - login gebruiken, maar niet alle entrypoints die ik zou willen gebruiken hebben een equivalent "dummy" -argument). - warp
Ten minste in Docker v1.11.1 lijkt het erop dat het opheffen van het --entrypoint ook voorkomt dat de CMD normaal aan het ingangspunt wordt toegevoegd. Dat lijkt alleen te gebeuren als het ingangspunt niet wordt overschreven. - Jasmine Hegman


Zien: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Relevant gedeelte:

CMD (standaard commando of opties) Roep het optionele COMMAND op in de opdrachtregel van Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Deze opdracht is optioneel omdat de persoon die de IMAGE heeft gemaakt mogelijk al een standaard COMMAND heeft geleverd met behulp van de Dockerfile CMD. Als de operator (de persoon die een container vanuit de afbeelding uitvoert), kunt u die CMD overschrijven door alleen een nieuwe COMMAND op te geven.

Als de afbeelding ook een ENTRYPOINT specificeert, dan worden de CMD of COMMAND als argumenten aan het ENTRYPOINT toegevoegd.

Dus om te doen wat je wilt, heb je nodig enkel en alleen geef een cmd op en vervang gebruik /bin/bash. Niet helemaal "leeg", maar het klopt 99%.


19
2018-06-12 07:31



Oeps, ik heb een detail over het hoofd gezien. Behalve voor verkorting --loginnaar -l Ik neem aan dat je oplossing al zo goed is als mogelijk. - Simon Thum
Dit is een leuk ding dat ik vandaag heb gezien: het commando is niet overschreven, het is toegevoegd. Dit is de PS vanuit de container. Merk op dat de opdracht die ik heb toegevoegd een echo was van "het instellen van de db" en het ingebouwde commando is / usr / bin / geth. Ook heb ik het entrypoint ingesteld als "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db - Paul S
De koppelingslink van het docker werkt niet meer - kan er geen voor de hand liggende vervanging voor vinden. - Chris Kimpton
Ik heb het zojuist opgelost, maar ik vond het ook moeilijk te vinden ( - Simon Thum


Voor iedereen die hier binnenkomt om het entrypoint AND-commando te negeren om andere opdrachten door te geven, bijvoorbeeld run bash in plaats van entrypoint script en voer dan een ander commando uit met parameters (was mij niet duidelijk uit andere antwoorden):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...' is parameter voor /bin/sh dus hier kun je elk commando doorgeven dat je in een container zou willen uitvoeren. /bin/sh is voor alpenbeelden, /bin/bash waarschijnlijk voor andere afbeeldingen.


7
2018-05-04 07:28



alleen een addtion shell-opdracht moet json-based writen zijn, dus in plaats van te citeren met enkele aanhalingstekens '...' gebruik dubbele aanhalingstekens "..." - Jimmy Obonyo Abor