Том доступа Docker без полномочий root для образа dotnet/runtime — разрешение отклонено

Мне отказывают в разрешении при попытке сохранить файл в томе докера. Прежде чем закрыть это как дубликат, я попробовал все вопросы/ответы, связанные с докером. Я подозреваю, что это связано с образом dotnet/runtime, который я использую, и с тем, как он настроен.

У меня есть это Dockerfile

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base

USER app
RUN mkdir /home/app/data
WORKDIR /home/app

COPY ./publish .

ENTRYPOINT ["dotnet", "MyProject.dll"]

Выполнение чего-то вроде File.WriteAllText("/home/app/data/file.txt", "lorem ipsum") в MyProject дает отказ в разрешении, когда том монтируется в Linux.

 docker run --rm \
    -v ./testdata:/home/app/data \
    -e RUN_ON_STARTUP=true \
    $image_name 

Это работает в Windows с установленной папкой. Это работает в Linux, ЕСЛИ папка не смонтирована.

Возможно ли вообще, чтобы это просто сработало? То есть запускать приложение без полномочий root, а для пользователей, запускающих образ, оно просто работает, и они видят файлы в смонтированных /home/app/data, ничего не делая?

Мне нужна помощь в том, как отладить это, не запуская приложение с правами root. И, надеюсь, все будет сделано в файле docker, и конечному пользователю не придется ничего делать.

Дополнительная информация об отладке

работает без монтирования /home/app/data на Linux

app@10a002ed6d04:~$ id
uid=1654(app) gid=1654(app) groups=1654(app)
app@10a002ed6d04:~$ ls -ld /home/app/data
drwxr-xr-x 2 app app 4096 Jun 24 07:06 /home/app/data

Запуск с /home/app/data, установленным на Linux

app@139b37a1d399:~$ id
uid=1654(app) gid=1654(app) groups=1654(app)
app@139b37a1d399:~$ ls -ld /home/app/data
drwxrwxr-x 2 1000 1000 4096 Jun 24 09:01 /home/app/data

Я не понимаю, откуда берется drwxrwxr-x 2 1000 1000, он не от хоста, разве мы не можем это изменить в файле докеров?

???

Обычно такая ошибка означает, что uid контейнера не соответствует uid файловой системы. В этом ответе есть довольно хорошее (родное для Linux) пошаговое руководство по изменению разрешений файла. Docker-compose устанавливает пользователя и группу на смонтированном томе также есть несколько хороших ответов. Помогла ли вам одна из этих рецензий?

David Maze 24.06.2024 11:53

Это действительно указывает мне в правильном направлении. Также часть моего вопроса: можно ли это сделать без каких-либо действий конечного пользователя? При первой записи кажется, что вам нужен правильный UID.

Marcel 24.06.2024 12:09

Теоретически, если контейнер работает от имени пользователя root, права файловой системы игнорируются. Но обычно это считается недостатком безопасности.

David Maze 24.06.2024 12:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть

USER app

в вашем Dockerfile, поэтому ваше приложение работает от имени предопределенного пользователя приложения с UID 64198.

Чтобы вы могли создавать файлы в смонтированном каталоге, UID 64198 должен иметь возможность создавать файлы на хосте в каталоге ./testdata.

Вы можете сделать это, предоставив общедоступный доступ для записи на хосте с помощью chmod o+w ./testdata.

Если это слишком либерально, вы можете создать на хосте пользователя с UID 64198 и предоставить этой группе пользователей доступ к каталогу.

Третий вариант — удалить USER app и запустить контейнер от имени пользователя root, у которого должен быть доступ.

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

Другие вопросы по теме