Próbuję dokerować moją aplikację node.js. Po zbudowaniu kontenera chcę, aby uruchamiał, git clone
a następnie uruchamiał serwer węzłów. Dlatego umieściłem te operacje w skrypcie .sh. I uruchom skrypt jako pojedyncze polecenie w ENTRYPOINT:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git
#install gcc 4.9
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y libstdc++-4.9-dev
#install newst nodejs
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD package.json /usr/src/app/
RUN npm install
ADD docker-entrypoint.sh /usr/src/app/
EXPOSE 8080
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
Mój docker-entrypoint.sh wygląda tak:
git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git
/usr/bin/node server.js
Po zbudowaniu tego obrazu i uruchomieniu:
docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>
Otrzymuję:
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Otwieram do kontenera, a zgoda docker-entrypoint.sh to:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
trzy pytania:
Czy mój skrypt bash ma nieprawidłową składnię?
Jak zmienić uprawnienia do pliku bash przed dodaniem go do obrazu?
Jaki jest najlepszy sposób uruchamiania wielu poleceń git w punkcie wejścia bez użycia skryptu bash?
Dzięki.
.sh
rozszerzenie pozostawia mylące wrażenie na temat tego, którzy tłumacze mogą je wykonać. Możesz rozważyć usunięcie tego - nie jest konwencjonalne, że polecenia UNIX mają rozszerzenia (ls.elf
na przykład nie uruchamiasz ).exec
w ten sposób mieć muszlę? czy nie potrzebowałbybash
przedrostka.Odpowiedzi:
„Odmowa uprawnień” całkowicie uniemożliwia wywołanie skryptu . Zatem jedyną składnią, która może być odpowiednia, jest składnia pierwszej linii („shebang”), która powinna wyglądać podobnie
#!/usr/bin/env bash
lub#!/bin/bash
lub podobnie w zależności od układu systemu plików celu.Najprawdopodobniej uprawnienia systemu plików nie są ustawione na zezwalanie na wykonywanie. Możliwe jest również, że shebang odwołuje się do czegoś, co nie jest wykonywalne, ale jest to znacznie mniej prawdopodobne.
Zepsuty przez łatwość naprawy poprzednich problemów.
Proste czytanie
... polega na tym, że skrypt nie jest oznaczony jako wykonywalny.
zajmie się tym w kontenerze. Alternatywnie możesz upewnić się, że lokalna kopia, do której odwołuje się plik Dockerfile, jest wykonywalna , a następnie użyć
COPY
(co jest jawnie udokumentowane w celu zachowania metadanych).źródło
noexec
flagą, uruchombash yourscript
zamiast./yourscript
.docker build
pojemnik pośredni działa dobrze. Ale kiedy to robiędocker run
, wyrzuca taki błąd. Wygląda na to, że mam magiczny pojemnik pośredni.Plik wykonywalny musi mieć ustawione uprawnienia do wykonywania, zanim będzie można go wykonać.
Na komputerze, na którym tworzysz obraz Dockera (a nie wewnątrz samego obrazu Dockera), spróbuj uruchomić:
Pierwsza kolumna danych wyjściowych dla twojego pliku wykonywalnego (w tym przypadku docker-entrypoint.sh) powinna mieć ustawione bity pliku wykonywalnego, takie jak:
Jeśli nie, spróbuj:
a następnie ponownie utwórz obraz Dockera.
Docker używa własnego systemu plików, ale kopiuje wszystko (w tym bity uprawnień) z katalogów źródłowych.
źródło
chmod +x docker-entrypoint.sh
na hoście jest w rzeczywistości zalecanym rozwiązaniem, ponieważ jest znacznie prostsze niż zmiana plikuDockerfile
.Napotkałem ten sam problem i został on rozwiązany przez
Dla pliku Dockerfile w oryginalnym pytaniu powinno wyglądać następująco:
źródło
sh
, ignorując specyfikację interpretera zawartą w shebang; więc jeśli używa#!/bin/bash
, mówiąc, że chce być interpretowane z bash, że będą ignorowane i będzie ona być interpretowanesh
w zamian, a więc wykluczający możliwości językowych jak[[ ]]
, tablic, itpJeśli nie używasz DockerFile, możesz po prostu dodać uprawnienie jako argument wiersza poleceń bash:
źródło
To jest stare pytanie zadane dwa lata przed moją odpowiedzią, i tak zamierzam opublikować, co zadziałało.
W moim katalogu roboczym mam dwa pliki: Dockerfile i Provision.sh
Dockerfile:
Provision.sh:
Mogłem uczynić plik w kontenerze Dockera wykonywalnym, ustawiając plik poza kontenerem jako wykonywalny,
chmod 700 provision.sh
a następnie uruchamiającdocker build .
.źródło