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

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

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

#!/bin/sh

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

screen -list > scr_list.log

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

вот сессия screen на: 
        14.my_screen      (12/18/24 17:55:29)     (Отключена) 
1 сокет в /run/screen/S-root.

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

Сокеты не найдены в /run/screen/S-root.

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

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

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

Чтобы начать сессию screen из скрипта запуска в Docker и сделать её постоянной, необходимо учитывать несколько важных аспектов. Ваша текущая конфигурация не позволяет иметь доступ к сокетам screen после инициализации контейнера, что и является источником проблемы. Давайте подробно рассмотрим, как правильно настроить вашу среду.

1. Понимание основ работы screen

screen — это утилита, которая позволяет управлять несколькими терминальными сессиями внутри одного окна. Она создаёт сокеты, которые хранятся в определённых директориях, например, /run/screen.

2. Проблема с сокетами

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

3. Решение проблемы

Для устранения этой проблемы, мы можем воспользоваться несколькими подходами:

a. Установка правильной директории для хранения сокетов

Вы можете установить переменную окружения SCREEN_SOCKDIR, чтобы указать директорию, где будут храниться сокеты screen. Например:

export SCREEN_SOCKDIR=/tmp/screen

Добавьте эту строку в ваш entrypoint скрипт. Убедитесь, что директория существует и доступна для записи.

b. Обновлённый entrypoint скрипт

Ваш entrypoint скрипт будет выглядеть следующим образом:

#!/bin/sh

# Создание директории для сокетов
mkdir -p /tmp/screen
export SCREEN_SOCKDIR=/tmp/screen

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

# Логирование списка сессий
screen -list > /tmp/scr_list.log

4. Проверка сессий

После того как вы запустили контейнер, вы можете подключиться к нему и проверить наличие сессий командой:

screen -list

Теперь вы должны видеть список активных сессий.

5. Подключение к сессии

Чтобы подключиться к уже существующей сессии, выполните команду:

screen -r my_screen

Заключение

Следуя данным рекомендациям, вы сможете корректно запустить сессию screen из вашего Docker-контейнера и обеспечить её сохранность. Убедитесь, что вы правильно настраиваете директории и условия работы сессий. Такое решение поможет поддерживать рабочие процессы более эффективно, минимизируя проблемы с доступом к сокетам screen.

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

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