Mam obraz dokera, który instaluje się grunt
, ale gdy próbuję go uruchomić, pojawia się błąd:
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
Jeśli uruchomię bash w trybie interaktywnym, grunt
jest dostępny.
Co ja robię źle?
Oto mój plik Docker:
# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs
MAINTAINER My Name, [email protected]
ENV HOME /home/web
WORKDIR /home/web/site
RUN useradd web -d /home/web -s /bin/bash -m
RUN npm install -g grunt-cli
RUN npm install -g bower
RUN chown -R web:web /home/web
USER web
RUN git clone https://github.com/repo/site /home/web/site
RUN npm install
RUN bower install --config.interactive=false --allow-root
ENV NODE_ENV development
# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]
CMD grunt
? A może możesz spróbować wykonać polecenie chrząkania, przechodząc pełną ścieżkę?CMD grunt?
Czy masz na myśli upuszczenie["
i"]
?CMD ["grunt"]
naCMD grunt
CMD ["grunt"]
używasz innej powłoki do wykonania polecenia, więc w tej powłoce $ PATH prawdopodobnie nie zostanie ustawiona.Odpowiedzi:
Kiedy użyjesz formatu exec dla polecenia (np.
CMD ["grunt"]
Tablica JSON z podwójnymi cudzysłowami), zostanie on wykonany bez powłoki. Oznacza to, że większość zmiennych środowiskowych nie będzie obecnych.Jeśli określisz swoje polecenie jako ciąg zwykły (np.
CMD grunt
), To ciąg po nimCMD
zostanie wykonany za pomocą/bin/sh -c
.Więcej informacji na ten temat jest dostępnych w sekcji CMD w pliku Dockerfile .
źródło
sudo set
lub(exec set)
. Te zawiodą, ponieważ wykonują polecenia bez powłoki (iset
są wbudowane w powłokę). Jednaksudo ls
i(exec ls)
będzie działać, ponieważls
jest to rzeczywisty plik binarny/bin/ls
.To był pierwszy wynik w Google, kiedy wkleiłem komunikat o błędzie, a to dlatego, że moje argumenty były nie na miejscu.
Nazwa kontenera musi być po wszystkich argumentach.
Zły:
Dobry:
źródło
Znalazłem ten sam problem. Zrobiłem następujące:
Kiedy zmienię to na
to działa dobrze.
źródło
-v
tutaj.-v
jest powiązanie zamontować wolumin (jak opisano wdocker run --help | grep "\-v"
), dla mnie już mam/tmp
zamontowany wFile Sharing
(Ustawienia Docker), więc dlaczego mam go używać ponownie?Istnieje kilka możliwych przyczyn takiego błędu.
W moim przypadku było to spowodowane tym, że plik wykonywalny (
docker-entrypoint.sh
z Dockerfile blogu Ghost ) nie ma trybu pliku wykonywalnego po jego pobraniu.Rozwiązanie:
chmod +x docker-entrypoint.sh
źródło
Kontener Docker może zostać zbudowany bez powłoki (np. Https://github.com/fluent/fluent-bit-docker-image/issues/19 ).
W takim przypadku możesz skopiować skompilowaną statycznie powłokę i wykonać ją, np
źródło
Z jakiegoś powodu pojawia się ten błąd, chyba że dodam wyjaśnienie „bash”. Nawet dodanie „#! / Bin / bash” na górze mojego pliku punktu wejścia nie pomogło.
źródło
COPY
a następnieRUN chmod +x /compile_nibbler.sh
przed wywołaniem punktu wejścia.Miałem ten sam problem: po wielu googlowaniach nie mogłem się dowiedzieć, jak to naprawić.
Nagle zauważyłem mój głupi błąd :)
Jak wspomniano w dokumentacji , ostatnia część
docker run
to polecenie, które chcesz uruchomić, i jego argumenty po załadowaniu kontenera.NIE NAZWA KONTENERA !!!
To był mój zawstydzający błąd.
Poniżej przedstawiłem ci zdjęcie mojej linii poleceń, aby zobaczyć, co zrobiłem źle.
I to jest poprawka, jak wspomniano w dokumentach .
źródło
aby działało, dodaj miękkie odniesienie do / usr / bin:
ln -s $ (który węzeł) / usr / bin / node
ln -s $ (który npm) / usr / bin / npm
źródło