Как использовать скрипт bash в Alpine Linux?

Я заинтересован в использовании wait-for-it, чтобы сделать один сервис в Docker- Compose ждать другого, используя образы на основе дистрибутива Alpine Linux.

Однако, если я клонирую репозиторий wait-for-it и добавлю в него следующий Dockerfile,

FROM alpine
RUN apk --update add bash
COPY wait-for-it.sh wait-for-it.sh
CMD ["./wait-for-it.sh", "www.google.com:80"]

Затем я создаю его, используя docker build --tag waitforit ., а затем docker run waitforit, но получаю следующее сообщение об ошибке:

timeout: can't execute '15': No such file or directory
wait-for-it.sh: timeout occurred after waiting 15 seconds for www.google.com:80

Напротив, это то, что я вижу при запуске этой команды на моем компьютере (Ubuntu 16.04 LTS):

wait-for-it.sh: waiting 15 seconds for www.google.com:80
wait-for-it.sh: www.google.com:80 is available after 0 seconds

Похоже, что скрипт bash не работает в контейнере Alpine, как на моей локальной машине с Ubuntu. Как я могу это исправить?


person Kurt Peek    schedule 10.05.2017    source источник
comment
Что такое исполняемый файл wait-for-it.sh? См. его первую строку. #!/bin/bash или sh?   -  person Robert    schedule 10.05.2017
comment
Похоже, ваш сценарий оболочки содержит ошибку. Пожалуйста, вставьте скрипт   -  person n2o    schedule 10.05.2017


Ответы (2)


Этот скрипт wait-for-it не совместим с sh, поэтому вам необходимо установить bash в образ alpine.

Однако могу ли я предложить избегать подобных «хаков» и вместо этого использовать HEALTHCHECK?

Например, когда одна служба ожидает, пока другая будет работоспособна, будет выглядеть так:

services:
  my_service:
    image: something
    healthcheck:
      test: nc -z 3306

  other_service
  depends_on:
    my_service:
      condition: service_healthy

Обратите внимание, это будет работать только с v2 файлом компоновки, а не с v3.

person Rawkode    schedule 10.05.2017
comment
Действительно, позже я нашел wait-for, основанный на wait-for-it, но совместимый с alpine. Что касается HEALTHCHECK, насколько я могу судить из документации, он работает < b>интервал секунд после запуска контейнера, а затем снова интервал секунд после завершения каждой предыдущей проверки. В моем случае, однако, я хотел бы запустить проверку только один раз, прежде чем запускать фактическое приложение, и заблокировать, пока она не пройдет. - person Kurt Peek; 10.05.2017
comment
Как вы можете прочитать в docker compose v3, depends_on больше не поддерживается: docs.docker.com /compose/compose-file/#depends_ondepends_on не ждет, пока db и redis будут «готовы» перед запуском web — только до тех пор, пока они не будут запущены. Если вам нужно дождаться готовности службы, см. раздел Управление порядком запуска, чтобы узнать больше об этой проблеме и стратегиях ее решения. - Версия 3 больше не поддерживает форму condition от depends_on. - Параметр depends_on игнорируется при развертывании стека в режиме роя с файлом Compose версии 3. - person viktorianer; 18.03.2020

Если вы попали сюда, как и я, в поисках решений ошибки «Нет такого файла или каталога» при запуске скриптов в Alpine, еще одна вещь, которую нужно проверить, это то, что ваш скрипт имеет окончания строки unix.

В моем случае я сохранял скрипт в Windows и добавлял его в образ докера, и он выдавал такое же бесполезное сообщение об ошибке.

person DShook    schedule 19.07.2017