Как запустить сценарий 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.