Uruchom skrypt w Dockerfile

93

Próbuję uruchomić skrypt podczas procesu kompilacji w moim pliku Dockerfile. Ale to nie działa.

Próbowałem w ten sposób:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

Również w ten sposób:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

A także bu wykonuję mój uruchomiony kontener:

docker exec symfony /bin/bash -c "/bootstrap.sh"

Wydaje się, że nic nie działa.

Czy wiesz jak to zrobić?

Kevin
źródło
Czy bootstarp.shjest ustawiony bit wykonywalny?
jwodder
Na przykład RUN chmod + x /bootstarp.sh?
Kevin
2
Co dokładnie się dzieje z „nie działa”? Czy to pokazuje błąd? Czy plik znajduje się w obrazie? Jeśli jesteś docker exec -it symfony bashw kontenerze, czy możesz ręcznie uruchomić skrypt i sprawdzić jego zawartość? ( cat bootstarp.sh)?
thaJeztah
spróbuj tego: docker exec symfony /bin/bash /bootstarp.shi daj mi znać wynik.
Boynux,
12
Ermahgerd bootstarp!
Bruno Bronosky

Odpowiedzi:

128

RUNi ENTRYPOINTsą dwoma różnymi sposobami wykonania skryptu.

RUNoznacza, że ​​tworzy kontener pośredni, uruchamia skrypt i zamraża nowy stan tego kontenera w nowym obrazie pośrednim. Po tym skrypt nie zostanie uruchomiony: ostateczny obraz powinien odzwierciedlać wynik tego skryptu.

ENTRYPOINT oznacza, że ​​obraz (który jeszcze nie wykonał skryptu) utworzy kontener i uruchomi ten skrypt.

W obu przypadkach należy dodać skrypt i RUN chmod +x /bootstrap.shjest to dobry pomysł.

Powinien również zaczynać się od shebang (jak #!/bin/sh)

Biorąc pod uwagę twój skrypt ( bootstarp.sh: kilka git config --globalpoleceń), najlepiej by było, gdyby RUNten skrypt był raz w twoim Dockerfile, ale upewnij się, że używasz właściwego użytkownika ( git configplik globalny to %HOME%/.gitconfig, który domyślnie jest tym /root)

Dodaj do swojego Dockerfile:

RUN /bootstart.sh

Następnie podczas uruchamiania kontenera sprawdź zawartość, /root/.gitconfigaby upewnić się, że skrypt został uruchomiony.

VonC
źródło
5
Mogłeś też mieć na myśli bootstrap.shzamiast bootstarp.sh: zobacz stackoverflow.com/a/1254561/6309
VonC,
Fajne! Działa bardzo dobrze z RUN /bootstrap.sh
Kevin
1
Shebang w pierwszej linii zrobił to za mnie, dzięki! :)
GDICommander
34

Oprócz powyższych odpowiedzi:

Jeśli utworzyłeś / edytowałeś plik skryptu .sh w systemie Windows, upewnij się, że został zapisany z końcówką wiersza w formacie Unix . Domyślnie wiele edytorów w systemie Windows konwertuje końcówki linii Unix do formatu Windows, a Linux nie rozpoznaje shebang (#! / Bin / sh) na początku pliku. Więc Linux wyświetli komunikat o błędzie, jak gdyby nie było shebang.

Porady:

  • Jeśli używasz Notepad ++, musisz kliknąć „Edit / EOL Conversion / UNIX (LF)”
  • Jeśli używasz Visual Studio, sugerowałbym zainstalowanie wtyczki „ End Of Line ”. Następnie możesz wyświetlić zakończenia linii, naciskając Ctrl-R, Ctrl-W. Aby ustawić zakończenia w stylu Linuksa, możesz nacisnąć Ctrl-R, Ctrl-L. W stylu Windows naciśnij Ctrl-R, Ctrl-C.
VeganHunter
źródło
4
Wow, uratowałeś mi dzień. Dziękuję Ci za to.
mw
2
Znakomity! to był mój DOKŁADNY problem!
Kevinsyel
1
Mój VSCode automatycznie ustawił liniowane zakończenia skryptu powłoki na CRLF w oknach. Kompilacja dockera nie powiodła się z powodu niektórych losowych znaków. Zmieniłem ustawienia w VS Code i od razu zaczęło działać. Dzięki! Głosowałem za.
Adithya Upadhya,
24

Spróbuj stworzyć skrypt z ADDpoleceniem i określeniem katalogu roboczego Tak jak to ("skrypt" to nazwa skryptu i /root/script.shto gdzie chcesz go umieścić w kontenerze, może to być inna ścieżka:

ADD script.sh /root/script.sh

W tym przypadku ADDmusi nastąpić wcześniej CMD, jeśli masz taki BTW to fajny sposób na importowanie skryptów do dowolnej lokalizacji w kontenerze z komputera hosta

Na CMDmiejscu[./script]

Powinien automatycznie wykonać skrypt

Możesz również określić WORKDIRjako /root, wtedy zostaniesz automatycznie umieszczony w katalogu głównym po uruchomieniu kontenera

Michał
źródło
W jaki sposób docker identyfikuje, gdzie na początku znajduje się script.sh? Mam na myśli, pierwszy parametr,script.sh
zachody słońca
ponieważ budujesz kontener, odpowiadasz również za umieszczanie ścieżek
Michael
ścieżka i nazwa pierwszego parametru script.shDockerfile
odnoszą
4

Najlepszą praktyką jest używanie COPYzamiast ADDpodczas kopiowania z lokalnego systemu plików do obrazu. Poleciłbym również utworzenie podfolderu, w którym będzie można umieścić zawartość. Co więcej, utrzymuje porządek. Upewnij się, że oznaczyłeś skrypt jako wykonywalny za pomocą chmod.

Tutaj tworzę scriptspodfolder, w którym mogę umieścić mój skrypt i uruchomić go z:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
ldobson
źródło