Jestem nowy w świecie dokerów. Muszę wywołać skrypt powłoki, który pobiera argumenty wiersza poleceń przez kontener Dockera. Np. Mój skrypt powłoki wygląda następująco:
#!bin/bash
echo $1
Dockerfile wygląda następująco:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
Nie jestem pewien, jak przekazać argumenty podczas uruchamiania kontenera
bash
shell
docker
command-line-arguments
Akash Mehta
źródło
źródło
docker run -ti test /file.sh abc
. Czuję, że skrypt się nie uruchomi, ponieważ powiniendocker run -ti test sh /file.sh abc
. sh lub / bin / sh uruchomi to poprawnie.z tym skryptem w formacie
file.sh
i to
Dockerfile
Powinieneś być w stanie:
źródło
ENTRYPOINT ./file.sh
chmod +x file.sh
ustawić flagi pliku wykonywalnego.["/file.sh"]
a/file.sh
a nawet[/file.sh]
W przypadku Dockera właściwym sposobem przekazywania tego rodzaju informacji są zmienne środowiskowe.
Więc z tym samym plikiem Dockerfile zmień skrypt na
Po zbudowaniu użyj następującego polecenia dokowanego:
źródło
Jest tu kilka rzeczy, które wchodzą w interakcje:
docker run your_image arg1 arg2
zastąpi wartośćCMD
zarg1 arg2
. To jest pełne zastąpienie CMD, bez dodawania do niego więcej wartości. Dlatego często widziszdocker run some_image /bin/bash
uruchamianie powłoki bash w kontenerze.Gdy masz zdefiniowane zarówno ENTRYPOINT, jak i CMD, docker uruchamia kontener, łącząc te dwa elementy i uruchamiając to połączone polecenie. Jeśli więc zdefiniujesz swój punkt wejścia
file.sh
, możesz teraz uruchomić kontener z dodatkowymi argumentami, które zostaną przekazane jako argumenty dofile.sh
.Punkty wejścia i polecenia w dockerze mają dwie składnie, składnię ciągu, która uruchomi powłokę, oraz składnię json, która wykona polecenie exec. Powłoka jest przydatna do obsługi takich rzeczy jak przekierowanie IO, łączenie wielu poleceń razem (z takimi rzeczami
&&
), podstawianie zmiennych itp. Jednak powłoka ta przeszkadza w obsłudze sygnału (jeśli kiedykolwiek widziałeś 10-sekundowe opóźnienie zatrzymania kontenera, to jest często przyczyna) oraz z połączeniem punktu wejścia i polecenia razem. Jeśli zdefiniujesz swój punkt wejścia jako łańcuch, będzie działać/bin/sh -c "file.sh"
, co samo w sobie jest w porządku. Ale jeśli masz polecenie zdefiniowane również jako ciąg, zobaczysz coś takiego,/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"
jak polecenie uruchamiane w twoim kontenerze, nie tak dobrze. Zobacz tabelę tutaj, aby uzyskać więcej informacji na temat interakcji tych dwóch opcjiOpcja powłoki
-c
przyjmuje tylko jeden argument. Wszystko po to by uzyskać przekazany jako$1
,$2
itp, w tym jeden argument, ale nie w osadzonym skryptem powłoki, chyba że wyraźnie przeszły args. To znaczy/bin/sh -c "file.sh $1 $2" "arg1" "arg2"
zadziała, ale/bin/sh -c "file.sh" "arg1" "arg2"
odfile.sh
tego czasu nie zostanie wywołany bez argumentów.Podsumowując, wspólny projekt to:
Następnie uruchamiasz to z:
Jest o wiele więcej szczegółów na ten temat pod adresem:
źródło
["bash", "--login", "-c"]
uzyskać źródło / etc / profile w obrazie, ale później zastanawiałem się, dlaczego żadne argumenty nie zostaną przekazane do skryptu powłoki przekazanego do uruchomienia dockera ... Twoja odpowiedź wyjaśniła to, dziękuję !To, co mam, to plik skryptu, który faktycznie uruchamia. Ten plik skryptu może być stosunkowo skomplikowany. Nazwijmy to „run_container”. Ten skrypt pobiera argumenty z wiersza poleceń:
Prostym run_container może być:
To, co chcę zrobić, to po "dokowaniu" tego chciałbym móc uruchomić ten kontener z parametrami w wierszu poleceń dockera, takimi jak:
i uruchom skrypt run_container z parametrami p1 p2 p3.
To jest moje rozwiązanie:
Dockerfile:
źródło
ENTRYPOINT
tablicy"/run_container \"$@\""
środkami oznacza, że argumenty zawierające spacje są obsługiwane poprawnie (npdocker run image_name foo 'bar baz' quux
.).Jeśli chcesz go uruchomić w czasie kompilacji:
jeśli chcesz go uruchomić @ run time:
Następnie w powłoce hosta
źródło
ENTRYPOINT
to dobra odpowiedź dla OP, który moim zdaniem potrzebował środowiska uruchomieniowego, ale jeśli naprawdę chcesz zmiennych czasu kompilacji, ta odpowiedź jest po prostu zepsuta. UżyjARG
idocker build --build-arg
docs.docker.com/engine/reference/builder/#argInna opcja...
Aby to działało
w pliku dockerfile
w entrypoint.sh
źródło