Мне отказывают в разрешении при попытке сохранить файл в томе докера. Прежде чем закрыть это как дубликат, я попробовал все вопросы/ответы, связанные с докером. Я подозреваю, что это связано с образом 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.
Теоретически, если контейнер работает от имени пользователя root, права файловой системы игнорируются. Но обычно это считается недостатком безопасности.
У вас есть
USER app
в вашем Dockerfile, поэтому ваше приложение работает от имени предопределенного пользователя приложения с UID 64198.
Чтобы вы могли создавать файлы в смонтированном каталоге, UID 64198 должен иметь возможность создавать файлы на хосте в каталоге ./testdata.
Вы можете сделать это, предоставив общедоступный доступ для записи на хосте с помощью chmod o+w ./testdata
.
Если это слишком либерально, вы можете создать на хосте пользователя с UID 64198 и предоставить этой группе пользователей доступ к каталогу.
Третий вариант — удалить USER app
и запустить контейнер от имени пользователя root, у которого должен быть доступ.
Обратите внимание: причина, по которой он работает без смонтированного тома, заключается в том, что в этом случае каталог принадлежит пользователю приложения. Но когда вы монтируете каталог хоста в контейнер, владение хостом и разрешения передаются в контейнер, поэтому именно они имеют значение.
Обычно такая ошибка означает, что uid контейнера не соответствует uid файловой системы. В этом ответе есть довольно хорошее (родное для Linux) пошаговое руководство по изменению разрешений файла. Docker-compose устанавливает пользователя и группу на смонтированном томе также есть несколько хороших ответов. Помогла ли вам одна из этих рецензий?