2017-06-28 59 views
6

Mam katalog zawierający tylko dwa pliki, Dockerfile i sayhello.sh:Jak uruchomić skrypt bash w pojemniku Alpine Docker

. 
├── Dockerfile 
└── sayhello.sh 

Dockerfile czyta

FROM alpine 
COPY sayhello.sh sayhello.sh 
CMD ["sayhello.sh"] 

i sayhello.sh zawiera po prostu

echo hello 

The Dockerfile buduje pomyślnie:

[email protected] ~/d/s/trybash> docker build --tag trybash . 
Sending build context to Docker daemon 3.072 kB 
Step 1/3 : FROM alpine 
---> 665ffb03bfae 
Step 2/3 : COPY sayhello.sh sayhello.sh 
---> Using cache 
---> fe41f2497715 
Step 3/3 : CMD sayhello.sh 
---> Using cache 
---> dfcc26c78541 
Successfully built dfcc26c78541 

Jednak gdy próbuję run to dostaję executable file not found in $PATH błąd:

[email protected] ~/d/s/trybash> docker run trybash 
container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH" 
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH". 
ERRO[0001] error getting events from daemon: net/http: request canceled 

Może ktoś wyjaśnić, co jest przyczyną tego? (Przypominam sobie uruchamianie skryptów na obrazach opartych na debian:jessie w podobny sposób, więc być może jest to specyficzne dla Alpine)?

Odpowiedz

9

Alpine pochodzi z/bin/sh jako domyślnej powłoki zamiast/bin/bash

Więc można

1) mają jako pierwszą linię swojej sayhello.sh shebang definiującej/bin/sh, więc sayhello.sh plik rozpocznie

#!/bin/sh

2) Zainstaluj bash w Alpine obrazu, jak zdają się oczekiwać bash jest obecny, z takiej linii w swojej Dockerfile

RUN apk add --update bash && rm -rf /var/cache/apk/*

1

Używając CMD, doker jest przeszukanie sayhello.sh w PATH, ale skopiowane go w / wich nie jest w PATH.

Więc użyj bezwzględną ścieżkę do skryptu chcesz wykonać:

CMD ["/sayhello.sh"] 

BTW, jak @ user2915097 powiedział uważać, że nie ma alpine bash domyślnie w przypadku skryptu używając go w szulernia.

1

Pamiętaj, aby nadać uprawnienia do wykonywania dla wszystkich skryptów.

FROM alpine 
COPY sayhello.sh /sayhello.sh 
RUN chmod +x /sayhello.sh 
CMD ["/sayhello.sh"] 
+1

Udzielenie zgody na przyznanie dotacji nie jest wymagane w pliku Dockerfile, jeśli ma już uprawnienia – aerokite

0

Ten answer jest całkowicie poprawny i działa dobrze.

Jest też inny sposób, można uruchomić skrypt bash w dokowanym oparciu alpejskiego

Musisz zmienić CMD jak poniżej

CMD ["sh", "sayhello.sh"] 

I to też działa.