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

Так что вы можете

  1. Пусть в первой строке вашего файла sayhello.sh указывается символ /bin/bash, поэтому ваш файл sayhello.sh начинается с.

    #!/bin/bash
    
  2. Установите 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.