Как запустить сессию screen из скрипта оболочки entrypoint и сделать её постоянной?

Вопрос или проблема

Я начинаю сессию экрана в своем скрипте оболочки entrypoint в docker, затем записываю вывод команды screen -list в файл.

#!/bin/bash

screen -S my_screen -dm bash -c 'cd project && npm run start'

screen -list > scr_list.log

Затем я подключаюсь к контейнеру docker и вижу полученный лог.

здесь экран на: 
        14.my_screen      (12/18/24 17:55:29)     (Отсоединён) 
1 сокет в /run/screen/S-root.

Но когда я вручную запускаю screen -list после подключения, он выводит:

Нет сокетов в /run/screen/S-root.

Используя того же пользователя (whoami): root

В данный момент у меня запущено несколько сервисов экрана внутри контейнера, и я время от времени вручную перезапускаю отдельные из них, когда вношу изменения в контейнер

Есть идеи, что может быть проблемой, пожалуйста?

Я разобрался с проблемой: npm не был найден.

С помощью read -p для приостановки скрипта я в конечном итоге обнаружил, что screen сохранялся, но был завершен.

Обновление

Чтобы добавить node и npm в вашу переменную $PATH, не зная номера версии, используйте:

source /root/.nvm/nvm.sh

Оригинальное решение

Запустив which npm, я нашел путь к своей установке npm (версии), затем добавил его в $PATH в моем скрипте.

export PATH=$PATH:/path/to/npm

(папка, в которой находится исполняемый файл npm)

Ответ или решение

Как запустить сессию Screen из сценария входной точки и сделать ее постоянной в Docker

Запуск сессии Screen в Docker-контейнере может быть полезным для выполнения фоновых процессов и их последующего мониторинга. Однако при неправильно настроенной среде, такой как отсутствие нужных переменных окружения, вы можете столкнуться с проблемами. В этой статье мы рассмотрим, как правильно запускать сессию Screen, а также основные моменты, которые следует учитывать для обеспечения ее устойчивости и надежности.

Шаг 1: Создание сценария входной точки

Для начала создайте сценарий входной точки (entrypoint script), который будет запускать новую сессию Screen. Убедитесь, что в контейнере установлены необходимые зависимости, такие как Node.js и npm. Пример сценария выглядит следующим образом:

#!/bin/bash

# Обновляем переменные PATH для доступа к npm
source /root/.nvm/nvm.sh

# Запускаем сессию screen с заданным именем и фоновым процессом
screen -S my_screen -dm bash -c 'cd /path/to/project && npm run start'

# Логируем список запущенных сессий screen
screen -list > scr_list.log

Шаг 2: Проверка установки npm

Проблемы с запуском процессов в сессии Screen могут возникнуть из-за отсутствия npm в PATH. Вы можете использовать команду which npm, чтобы определить, где установлен npm, и затем добавить его в PATH. Например:

export PATH=$PATH:/path/to/npm

Убедитесь, что путь к npm указан правильно, и он действительно доступен в исполняемой среде вашего контейнера.

Шаг 3: Убедитесь, что скрипт исполняется как root

При использовании Docker важно удостовериться, что скрипт выполняется от имени пользователя, который имеет нужные права. Если вы запускаете контейнер от имени пользователя root, то указанный выше код должен работать без дополнительных изменений.

Шаг 4: Мониторинг и отладка

Если после выполнения скрипта сессии Screen не сохраняются, рекомендуется проводить отладку через добавление паузы в скрипт, чтобы следить за выводом и состоянием окружения:

read -p "Press enter to continue"

Это позволит вам проверить, активна ли сессия и существуют ли ошибки, связанные с путями или окружением.

Шаг 5: Проверка состояния сессий

После запуска контейнера и выполнения скрипта используйте команду screen -list, чтобы проверить, какие сессии запущены. Если вы видите, что сессия была создана, но позже исчезла, возможно, проблема заключается в том, что процесс, запущенный внутри сессии, завершился, возможно, из-за ошибок в коде или неправильных зависимостей.

Заключение

Запуск сессии Screen из сценария входной точки в Docker — это мощный инструмент для управления долгоживущими процессами. Следуя указанным шагам, вы сможете настроить устойчивую и надежную среду для вашего приложения. Не забудьте проводить тестирование и отладку, чтобы убедиться, что ваш проект работает правильно и устойчиво к сбоям.

Оцените материал
Добавить комментарий

Капча загружается...