Docker: Отправка файлов журналов от нехозяйственного пользователя в /dev/stdout

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

Я пытаюсь запустить контейнер Docker, который имеет 2 сервиса. Один из этих сервисов должен быть запущен от имени пользователя без прав администратора, иначе он не запустится. Другой должен работать от имени root.

Теперь я хочу связать файл non_root_service.log с /dev/tty или /dev/stdout, чтобы логи могли быть собраны docker (проверьте с помощью docker logs $CONTAINER):

ln -s /dev/stdout non_root_service.log

Проблема в том, что у пользователя без прав администратора нет прав на запись как в /dev/tty, так и в /dev/stdout, что приводит к следующей ошибке при запуске non-root-сервиса:

cannot open "non_root_service.log": Permission denied

Но если я не создаю ссылку, я не смогу собрать логи с помощью docker logs $CONTAINER. Есть ли у кого-то идея, как это можно исправить, чтобы я мог запускать пользователя как non-root И связывать файлы логов с /dev/{tty,stdout}?

П.С.: Не имеет значения, используешь ли ты в качестве шелл-скрипта CMD ["starter.sh"] или супервизор CMD ["supervisord", "-n", "-c", "/app/supervisord.conf"] для запуска 2 сервисов, с обоих я получаю ту же ошибку.

Может быть, это не самое чистое решение, но не могли бы вы попробовать следующее:

tail -f non_root_service.log &

Чтобы просто выводить файл в stdout и поместить процесс tail в фон? Вы также можете попробовать отправить вывод прямо в stdout:

ln -s ln -fs /proc/self/fd/1 non_root_service.log

Но вы уверены, что у вас есть права на файл non_root_service.log? Что вы видите, если выполните stat non_root_service.log и whoami?

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

Проблема: Отправка логов из контейнера Docker не-root пользователем в /dev/stdout

Описание Проблемы

В процессе работы с Docker-контейнера, включающего два сервиса, возникла необходимость запуска одного из них (non-root service) от имени пользователя без прав суперпользователя. При этом лог-файл non_root_service.log требуется перенаправить на стандартный вывод (/dev/stdout), чтобы обеспечить доступ к логам через команду docker logs $CONTAINER. Однако возникла ошибка, связанная с правами доступа к non_root_service.log, когда не-root пользователь пытается записать в него, что приводит к ошибке:

cannot open "non_root_service.log": Permission denied

Возможные Решения

1. Использование tail для просмотра логов

Одним из простых обходных решений может стать использование команды tail для вывода логов на стандартный вывод. Это может быть реализовано через следующий скрипт:

tail -f non_root_service.log &

Эта команда запускает процесс tail, который в фоновом режиме будет следить за изменениями в файле логов и выводить их на stdout.

2. Создание символической ссылки на stdout

Другим подходом является создание символической ссылки на файловый дескриптор:

ln -s /proc/self/fd/1 non_root_service.log

Этот способ позволяет указать, что лог-файл будет записываться непосредственно в стандартный вывод, что эффективным образом обходит проблему с правами доступа. Важно помнить, что /proc/self/fd/1 всегда ссылается на stdout текущего процесса.

Проверка прав и владельца

Для успешного применения предложенных решений следует убедиться, что у лог-файла non_root_service.log установлены правильные права доступа. Выполните команды:

stat non_root_service.log
whoami

Это покажет права для файла и пользователя, от имени которого выполняется процесс. Убедитесь, что текущий пользователь имеет право на запись в данный файл. Чтобы изменить права на файл и дать доступ пользователю, можно использовать команду:

chmod 664 non_root_service.log

или изменить владельца файла с помощью:

chown username:groupname non_root_service.log

где username и groupname – соответствующий пользователь и группа, под которыми запускается процесс.

Использование Dockerfile

В качестве последнего решения, вы можете настроить ваш Dockerfile, чтобы завести необходимого пользователя и установить нужные права доступа к лог-файлам:

RUN adduser --disabled-password myuser
RUN chown myuser:myuser /path/to/non_root_service.log
USER myuser

Заключение

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

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

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