Вопрос или проблема
Я пытаюсь запустить контейнер 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-контейнерах является ключевым моментом для избежания подобных проблем. Состояние прав доступа к лог-файлам обязательно должно контролироваться для обеспечения корректной работы контейнера.