Как запустить скрипт 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
строит успешно:
[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
Однако, если я пытаюсь run
это сделать, я получаю ошибку executable file not found in $PATH
:
[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
Что вызывает это? (Я помню, как выполнял сценарии на изображениях debian:jessie
-based подобным образом, так что, возможно, это относится к Alpine)?
Ответы
Ответ 1
Alpine поставляется с пеплом в качестве оболочки по умолчанию вместо bash
.
Так что вы можете
Пусть в первой строке вашего файла sayhello.sh указывается символ /bin/bash, поэтому ваш файл sayhello.sh начинается с.
#!/bin/bash
Установите Bash в свой образ Alpine, как вы, вероятно, ожидаете, когда присутствует Bash, с такой строкой в вашем Dockerfile:
RUN apk add --no-cache --upgrade bash
Ответ 2
Этот ответ совершенно прав и работает нормально.
Есть другой способ. Вы можете запустить скрипт Bash в контейнере Docker на основе Alpine.
Вам нужно изменить CMD, как показано ниже:
CMD ["sh", "sayhello.sh"]
И это тоже работает.
Ответ 3
Не забудьте предоставить разрешение на выполнение для всех скриптов.
FROM alpine
COPY sayhello.sh /sayhello.sh
RUN chmod +x /sayhello.sh
CMD ["/sayhello.sh"]
Ответ 4
Используя CMD
, Docker выполняет поиск файла sayhello.sh
в PATH
, НО вы скопировали его в /
, которого нет в PATH
.
Поэтому используйте абсолютный путь к сценарию, который вы хотите выполнить:
CMD ["/sayhello.sh"]
Кстати, как сказал @user2915097, будьте осторожны, так как Alpine не имеет Bash по умолчанию, если ваш скрипт использует его в shebang.