Jak mogę zastąpić CMD podczas uruchamiania obrazu dokera?

123

Chcę sprawdzić obraz dokera utworzony przez kogoś innego z określonym punktem wejścia i cmd, na przykład:

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

Obecnie robię:

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

Czy istnieje sposób na zastąpienie CMD, aby był pusty (więc nie muszę używać „--login”)?

osnowa
źródło

Odpowiedzi:

125

Możesz po prostu wejść przez docker run -it --entrypoint=/bin/bash $IMAGE -i(uruchomisz nowy kontener z obrazu i uzyskasz powłokę bash w trybie interaktywnym), a następnie uruchom polecenie entrypoint w tym kontenerze.

Następnie możesz sprawdzić działający kontener w stanie, w jakim powinien być uruchomiony.

EDYCJA: Od Dockera 1.3 możesz użyć execdo uruchomienia procesu w działającym kontenerze. Uruchom kontener tak jak zwykle, a następnie wprowadź go, wydając:

docker exec -it $CONTAINER_ID /bin/bash

Zakładając, że bash jest zainstalowany, otrzymasz dostęp powłoki do działającego kontenera.

Panagiotis Moustafellos
źródło
Czy nie wykonałoby to polecenia „/ usr / sbin / apache2ctl / bin / bash”? (ponieważ twój przykład nie zastępuje punktu wejścia, użyje punktu wejścia zdefiniowanego w Dockerfile - czy coś mi brakuje?)
wypaczenie
Czy to może być coś innego w przypadku starszych / nowszych wersji dokerów? Na pewno działa dla mnie punkt wejścia: gist.github.com/warpr/26a5cc471dce7fcf9021 . To używa dokera 0.10.0 na Ubuntu 13.10.
wypaczenie
4
Wiem, że przejście - punkt wejścia zastępuje punkt wejścia. Ale kiedy używam --entrypoint, jak mogę zastąpić CMD, aby był pusty? (W przypadku bash mogę użyć czegoś takiego jak -i lub --login, ale nie wszystkie punkty wejścia, których chciałbym użyć, będą miały równoważny argument „obojętny”).
wypaczenie
1
Przynajmniej w Docker v1.11.1 wydaje się, że przesłonięcie --entrypoint również uniemożliwia normalne dołączenie CMD do punktu wejścia. Wydaje się, że dzieje się to tylko wtedy, gdy punkt wejścia nie jest przesłonięty.
Jasmine Hegman
1
Dlaczego jest -ipo $IMAGE?
Eyal Levin,
27

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

Odpowiednia część:

CMD (Domyślne polecenie lub opcje) Przywołaj opcjonalne POLECENIE w wierszu poleceń Dockera:

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

To polecenie jest opcjonalne, ponieważ osoba, która utworzyła OBRAZ, mogła już podać domyślną POLECENIE za pomocą pliku CMD Dockerfile. Jako operator (osoba uruchamiająca kontener z obrazu) możesz zastąpić CMD, po prostu określając nowe POLECENIE.

Jeśli obraz określa również ENTRYPOINT, wówczas CMD lub COMMAND zostają dołączone jako argumenty do ENTRYPOINT.

Tak, aby robić to, co chcesz, musisz tylko określić cmd, a zastępują użyciu /bin/bash. Nie do końca „pusty”, ale wykonuje zadanie w 99%.

Simon Thum
źródło
Ups, przeoczyłem jakiś szczegół. Z wyjątkiem skrótu --logindo, -lmyślę, że twoje rozwiązanie jest już tak dobre, jak to możliwe.
Simon Thum,
Oto zabawna rzecz, którą widziałem dzisiaj: polecenie nie zostało zastąpione, zostało dołączone. Oto PS z wnętrza kontenera. Zauważ, że polecenie, które dodałem, to echo „konfigurowanie bazy danych”, a wbudowane polecenie to / usr / bin / geth. Ustawiłem także punkt wejścia na „”. 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S
Łącze referencyjne dokera już nie działa - nie można znaleźć oczywistego zamiennika.
Chris Kimpton,
Właśnie to naprawiłem, ale też trudno mi było znaleźć (
Simon Thum
15

Dla każdego, kto tu przyjdzie, aby zastąpić punkt wejścia ORAZ polecenie przekazać inne polecenie, np. Uruchom bash zamiast skryptu punktu wejścia, a następnie uruchom inne polecenie z parametrami (nie było dla mnie jasne z innych odpowiedzi):

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

-c 'npm link ...'jest parametrem, /bin/shwięc możesz przekazać dowolne polecenie, które chcesz uruchomić w kontenerze. /bin/shjest dla obrazów alpejskich, /bin/bashnajprawdopodobniej dla innych obrazów.

infro
źródło
1
tylko polecenie powłoki powinno być napisane na bazie jsona, więc zamiast cytowania z pojedynczymi cudzysłowami '...'używaj podwójnych cudzysłowów"..."
Jimmy Obonyo Abor
Lub po prostu podaj tyle argumentów, ile chcesz
Nick Roz
wydaje się, że to nie działa: "exec: \" - c \ ": nie znaleziono pliku wykonywalnego w $ PATH": nieznany.
Richard
Sprawdź ścieżkę w kontenerze, może tak naprawdę nie istnieje. Większość obrazów ma, /bin/shale twój może nie być tak.
inf.