Отказано в разрешении, когда приложение python пытается записать файл журнала в общий том в docker

#python #docker #logging #docker-compose

Вопрос:

Я пытаюсь написать простое приложение на python для запуска внутри docker с пользователем, не являющимся пользователем root, и я хочу войти в общий том с файлами журналов.

докер-compose.yml

 version: '3.7'

services:
  testapp:
    hostname: pythonapp
    container_name: pythonapp
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - TZ=Europe/Rome
    ports:
      - "8080:8080"
    volumes:
      - ./log:/home/pythonapp/src/log
 

файл сборки docker

 FROM python:3

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Create a user with given UID.
RUN useradd -m -u 5000 pythonapp
USER pythonapp
RUN id

RUN mkdir -p /home/pythonapp/src/log
RUN chown -R pythonapp:pythonapp /home/pythonapp 
WORKDIR /home/pythonapp/src

## copy from host to container files
COPY --chown=pythonapp:pythonapp . .

## install dependencies
RUN pip install --user --upgrade pip
RUN pip install --user -r requirements.txt

CMD ["python", "/home/pythonapp/src/pythonapp.py", "-p", "8080"]
 

Перед созданием образа я создал папку журнала на хосте macchine.

 mkdir log
ls -la
>>> drwxrwxr-x 2 tabita tabita 4096 ott  2 19:16 log

setfacl -m u:5000:rwx ./log

ls -la
>>> drwxrwxr-x  2 tabita tabita 4096 ott  2 19:16 log

getfacl log/
>>># file: log/
# owner: tabita
# group: tabita
user::rwx
user:5000:rw-
group::rwx
mask::rwx
other::r-x

 

Затем я создал изображение с помощью docker-compose

 docker-compose -f docker-compose.yml up --build -v
 

Однако здесь я получаю ошибку

 pythonapp | /home/pythonapp/src
pythonapp | pythonapp
pythonapp | uid=5000(pythonapp) gid=5000(pythonapp) groups=5000(pythonapp)
pythonapp | Traceback (most recent call last):
pythonapp |   File "/home/pythonapp/src/ssh_honeypot.py", line 28, in <module>
pythonapp |     logging.basicConfig(
pythonapp |   File "/usr/local/lib/python3.9/logging/__init__.py", line 2003, in basicConfig
pythonapp |     h = FileHandler(filename, mode,
pythonapp |   File "/usr/local/lib/python3.9/logging/__init__.py", line 1146, in __init__
pythonapp |     StreamHandler.__init__(self, self._open())
pythonapp |   File "/usr/local/lib/python3.9/logging/__init__.py", line 1175, in _open
pythonapp |     return open(self.baseFilename, self.mode, encoding=self.encoding,
pythonapp | PermissionError: [Errno 13] Permission denied: '/home/pythonapp/src/log/pythonapp.log'
pythonapp exited with code 1
 

отладка

Я попытался проникнуть в контейнер и создать файл в папке журнала. Я могу создать один, но из хост-системы я не вижу созданный файл.

Не могли бы вы, пожалуйста, помочь мне?

Ответ №1:

Я пробовал ваши файлы с помощью этого скрипта :

 # pythonapp.py
with open('/home/pythonapp/src/log/test.txt', 'w') as f:
    f.write("Hello world!")
 

Это работает очень хорошо, только если x доступ предоставлен пользователю 5000 .

это разрешение необходимо для просмотра каталога журналов.

Что касается ваших выходных данных, в настоящее время разрешения rw-

 getfacl log/
>>># file: log/
...
user:5000:rw-
...
 

Поскольку ваша процедура казалась точной, не могли бы вы повторить попытку с этого :

журнал находится в моем рабочем каталоге

  1. Добавьте права для пользователя с UID:5000 :
     setfacl -m u:5000:rwx log
     
  2. Проверьте права, rwx требуется

    Я думаю, что —табличный-хороший вариант для просмотра разрешений ACL

     getfacl --tabular log 
    # file: log
    USER   <myuser>  rwx     
    user   5000      rwx     
    GROUP  <myuser>  rwx     
    mask             rwx     
    other            r-x  
     
  3. pythonapp.py должна быть возможность записи в каталоге журнала:

    докер-составить —построить

     Step 13/13 : CMD ["python", "/home/pythonapp/src/pythonapp.py", "-p", "8080"]
     ---> Using cache
    ---> fcd2afb9f961
    Successfully built fcd2afb9f961
    Successfully tagged so_testapp:latest
    Starting pythonapp ... done
    Attaching to pythonapp
    pythonapp exited with code 0
     

Комментарии:

1. Спасибо. Это помогло и сработало. Не могли бы вы объяснить, пожалуйста, почему X требуется в журнале setfacl-m u:5000:rwx.

2. Это возможность компакт-диска в этом каталоге , . ——-> ./журнал/. Пожалуйста, ознакомьтесь с этим полезным ответом unix.stackexchange.com/a/21253