Вопрос или проблема
Я начинаю сессию 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
.