Как запустить сценарий bash в контейнере Alpine Docker

у меня есть каталог, содержащий только два файла, Dockerfile и sayhello.sh:

.
├── Dockerfile
└── sayhello.sh

на Dockerfile читает

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

и sayhello.sh С

echo hello

на Dockerfile успешно строит:

kurtpeek@Sophiemaries-MacBook-Pro ~/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

однако, если я попытаюсь run это я executable file not found in $PATH ошибка:

kurtpeek@Sophiemaries-MacBook-Pro ~/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 

может кто-нибудь объяснить, что является причиной этого? (Я помню, как запускал скрипты в debian:jessie - изображения на основе аналогичным образом, так что, возможно, это это альпийская специфика)?

4 ответов


Alpine поставляется с/bin /sh в качестве оболочки по умолчанию вместо/bin / bash

вы можете

1) имейте как первая строка вашего sayhello.sh shebang, определяющий /bin/ sh, поэтому ваш файл sayhello.sh начнем с

#!/bin/sh

2) Установите bash в свой Альпийский образ, как вы, похоже, ожидаете, что bash присутствует, с такой строкой в вашем Dockerfile

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


Не забудьте предоставить разрешение на выполнение всех скриптов.

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

этой ответ полностью прав и работает нормально.

есть другой способ, вы можете запустить скрипт bash в alpine docker

вам нужно изменить CMD, как ниже

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

и это тоже работает.


С помощью CMD, docker ищет sayhello.sh на PATH, а вы скопировали его в / не в PATH.

поэтому используйте абсолютный путь к скрипту, который вы хотите выполнить:

CMD ["/sayhello.sh"]

кстати, как сказал @user2915097, будьте осторожны, что alpine не имеет bash по умолчанию в случае вашего скрипта, использующего его в shebang.