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ć?
docker
dockerfile
Kevin
źródło
źródło
bootstarp.sh
jest ustawiony bit wykonywalny?docker exec -it symfony bash
w kontenerze, czy możesz ręcznie uruchomić skrypt i sprawdzić jego zawartość? (cat bootstarp.sh
)?docker exec symfony /bin/bash /bootstarp.sh
i daj mi znać wynik.Odpowiedzi:
RUN
iENTRYPOINT
są dwoma różnymi sposobami wykonania skryptu.RUN
oznacza, ż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.sh
jest to dobry pomysł.Powinien również zaczynać się od shebang (jak
#!/bin/sh
)Biorąc pod uwagę twój skrypt (
bootstarp.sh
: kilkagit config --global
poleceń), najlepiej by było, gdybyRUN
ten skrypt był raz w twoimDockerfile
, ale upewnij się, że używasz właściwego użytkownika (git config
plik globalny to%HOME%/.gitconfig
, który domyślnie jest tym/root
)Dodaj do swojego Dockerfile:
Następnie podczas uruchamiania kontenera sprawdź zawartość,
/root/.gitconfig
aby upewnić się, że skrypt został uruchomiony.źródło
bootstrap.sh
zamiastbootstarp.sh
: zobacz stackoverflow.com/a/1254561/6309Opró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:
źródło
Spróbuj stworzyć skrypt z
ADD
poleceniem i określeniem katalogu roboczego Tak jak to ("skrypt" to nazwa skryptu i/root/script.sh
to gdzie chcesz go umieścić w kontenerze, może to być inna ścieżka:W tym przypadku
ADD
musi nastąpić wcześniejCMD
, jeśli masz taki BTW to fajny sposób na importowanie skryptów do dowolnej lokalizacji w kontenerze z komputera hostaNa
CMD
miejscu[./script]
Powinien automatycznie wykonać skrypt
Możesz również określić
WORKDIR
jako/root
, wtedy zostaniesz automatycznie umieszczony w katalogu głównym po uruchomieniu konteneraźródło
script.sh
script.sh
Dockerfile
Najlepszą praktyką jest używanie
COPY
zamiastADD
podczas 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ę
scripts
podfolder, w którym mogę umieścić mój skrypt i uruchomić go z:źródło