Использование тайм-аута при запуске docker из скрипта

#bash #docker

#bash #docker

Вопрос:

В моем Travis CI частью моей проверки является запуск контейнера docker и проверка того, что он не завершается сбоем в течение 10 секунд. У меня есть yarn скрипт docker:run:local , который вызывает docker run -it <mytag> node app.js .

Если я вызываю скрипт yarn с timeout помощью из оболочки bash, он работает нормально:

 $ timeout 10 yarn docker:run:local; test $? -eq 124 amp;amp; echo "Container ran for 10 seconds without error"
 

Это вызывает docker run , позволяет ему работать в течение 10 секунд, затем убивает его (если он еще не возвращен). Если код выхода равен 124, время ожидания истекло, что означает, что контейнер все еще работал. Именно то, что мне нужно, чтобы убедиться, что мой контейнер docker достаточно вменяем.

Однако, как только я запускаю эту же команду из скрипта, либо в test.sh файле, вызываемом из оболочки, либо при размещении его в другом скрипте yarn и вызове yarn test:docker , поведение полностью меняется. Я получаю:

ERRO[0000] error waiting for container: context canceled

Затем команда зависает навсегда, 10-секундный тайм-аут отсутствует, я должен нажать ctrl-Z, а затем kill -9 завершить процесс. Если я запущу top , то теперь у docker меня будет процесс, использующий весь мой процессор навсегда. При использовании timeout с любой другой командой, подобной sleep 20 amp;amp; echo "Finished sleeping" , этого не происходит, поэтому я подозреваю, что это может иметь какое-то отношение к тому, как docker работает в интерактивном режиме или что-то в этом роде, но это только мое предположение.

Что приводит timeout docker:run к сбою скрипта, но нормально работает из оболочки, и как мне заставить это работать?

Комментарии:

1. Попробуйте использовать docker -a в отличие от docker -i

2. На самом деле -it полное удаление, похоже, решило эту проблему, и мне на самом деле не нужен интерактивный режим для запуска моего приложения. Спасибо.

Ответ №1:

Похоже, проблема вызвана запуском docker в интерактивном режиме.

Запустите docker в отключенном режиме, удалив -it и разрешив ему работать в отключенном режиме по умолчанию или указав -d вместо -it и так далее:

 docker run -d <mytag> node
 

или

 docker run <mytag> node