Задать вопрос

Docker volume как просто задать права на создаваемые файлы?

Добрый день.

Как просто задать права на создаваемые файлы в папках проброшенных на хостовую систему?
Пользователь deploy, uid 1004, состоит в группе docker
Пробрасываю папку в контейнер при запуске, пишу в файл, выхожу

deploy@vc:~$ docker run --rm -ti -v $PWD/l2:/l2 debian bash
root@72981f87a7e4:/# echo booo! > l2/2
root@72981f87a7e4:/# exit
exit

права на файл - root root

deploy@vc:~$ ls -lh l2/2 
-rw-r--r-- 1 root root 6 May 22 12:38 l2/2


ок, запускаюсь с -u и работаю под юзером "I have no name!" ))
deploy@vc:~$ docker run --rm -ti -u $(id -u) -v $PWD/l2:/l2 debian bash
I have no name!@30e0dcea97fa:/$


создаю файл и оно создается с правильными UID на хостовой системе но ессно, что то более сложное уже не работает.

docker run --rm -ti -u $(id -u) -v $PWD/l2:/var/lib/postgresql/data postgres
chown: changing ownership of `/var/lib/postgresql/data': Operation not permitted


и так да, не работает по понятным причинам.

пробовал включать наследование на папке - помогает, но не сильно, наследую группу пользователя, но в виду umask 0022 в контейнере у root получаю права для группы только чтение.

можно заморачиваться и пересобирать контейнер с создаваемым пользователем (с заданным uid и gid ), выставлять права на папки и тд, но это требует времени.

пока выхожу из ситуации через sudo возвращая владельцая файлов, но может я не умею готовить расширенные права на файловой системе?

можно ли как то более просто управлять правами в случае проброшенных volumes ?

UPD

ACL решает проблему частично.

user@dockers:~$ docker run --rm -ti -v $PWD/ll:/ll busybox sh
/ # echo root > /ll/1
/ # ls -lh /ll/1 
-rw-r--r--    1 root     root           5 May 23 16:48 /ll/1
/ # exit
user@dockers:~$ echo $(id -u) >> ll/1
-bash: ll/1: Отказано в доступе
user@dockers:~$ setfacl -d -m u::rwx,g::r,o::-,u:$(whoami):rwx ll
user@dockers:~$ echo $(id -u) >> ll/1
-bash: ll/1: Отказано в доступе
user@dockers:~$ rm -rf ll/1
user@dockers:~$ ls -lh ll/1
ls: невозможно получить доступ к ll/1: Нет такого файла или каталога
user@dockers:~$ docker run --rm -ti -v $PWD/ll:/ll busybox sh
/ # echo root2 > /ll/1
/ # ls -lh /ll/1 
-rw-rw----    1 root     root           6 May 23 16:49 /ll/1
/ # exit
user@dockers:~$ echo $(id -u) >> ll/1
user@dockers:~$ cat ll/1
root2
1000
user@dockers:~$ rm ll/1
user@dockers:~$ ls -lh ll/1
ls: невозможно получить доступ к ll/1: Нет такого файла или каталога


В случае если процесс в контейнере меняет владельца директории то все становится плохо.

user@dockers:~$ mkdir db
user@dockers:~$ ls -lhd db
drwxrwxr-x+ 2 user user 4,0K мая   23 20:22 db
user@dockers:~$ getfacl db
# file: db
# owner: user
# group: user
user::rwx
user:user:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:user:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

user@dockers:~$ docker run -d -v $PWD/db:/var/lib/postgresql/data --name postgres postgres
a4bcadb8b48d001c2c7846a79ad09a7468aa20d3fa265822464a0dd23481bf16
user@dockers:~$ ls -lh db
ls: невозможно открыть каталог db: Отказано в доступе
user@dockers:~$ ls -lhd db
drwx------+ 18 999 user 4,0K мая   23 20:23 db
user@dockers:~$ getfacl db
# file: db
# owner: 999
# group: user
user::rwx
user:user:rwx			#effective:---
group::r-x			#effective:---
mask::---
other::---
default:user::rwx
default:user:user:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

user@dockers:~$ setfacl -m u:user:rwx db
setfacl: db: Операция не позволена


UPD2

можно возвращать права на volume через docker

user@dockers:~$ mkdir db
user@dockers:~$ ls -lh db
итого 0
user@dockers:~$ docker run -d -v $PWD/db:/var/lib/postgresql/data --name postgres postgres
6f839610604dca662a585b73dbbe9204b805887bd12a3826a1a7bdebfa1025a4
user@dockers:~$ ls -lh db
ls: невозможно открыть каталог db: Отказано в доступе
user@dockers:~$ docker stop postgres 
postgres
user@dockers:~$ docker rm postgres 
postgres
user@dockers:~$ ls -lh db
ls: невозможно открыть каталог db: Отказано в доступе
user@dockers:~$ ID=$(id -u)
user@dockers:~$ docker run --rm -ti -v $PWD/db:/db busybox sh -c "chown -R $ID db"
user@dockers:~$ ls -lh db
итого 112K
drwx------+ 5 user docker 4,0K мая   23 21:47 base
drwx------+ 2 user docker 4,0K мая   23 21:47 global
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_clog
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_dynshmem
-rw-------+ 1 user docker 4,4K мая   23 21:47 pg_hba.conf
-rw-------+ 1 user docker 1,6K мая   23 21:47 pg_ident.conf
drwx------+ 4 user docker 4,0K мая   23 21:47 pg_logical
drwxrwxr-x+ 4 user docker 4,0K мая   23 21:47 pg_multixact
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_notify
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_replslot
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_serial
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_snapshots
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_stat
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_stat_tmp
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_subtrans
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_tblspc
drwx------+ 2 user docker 4,0K мая   23 21:47 pg_twophase
-rw-rw-r--+ 1 user docker    4 мая   23 21:47 PG_VERSION
drwx------+ 3 user docker 4,0K мая   23 21:47 pg_xlog
-rw-------+ 1 user docker   88 мая   23 21:47 postgresql.auto.conf
-rw-------+ 1 user docker  21K мая   23 21:47 postgresql.conf
-rw-rw-r--+ 1 user docker   37 мая   23 21:47 postmaster.opts
  • Вопрос задан
  • 15917 просмотров
Подписаться 6 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@nitrobin
На эту тему есть даже запрос в оффициальном github docker https://github.com/docker/docker/issues/7198#issue...

Есть вариант с монтированием в режиме чтения /etc/passwd, /etc/group и пробросом своего uid
Подсмотрено тут: wiki.ros.org/docker/Tutorials/GUI

docker run --rm  -ti \
           -v $(pwd):/tmp/hx \
           -w /tmp/hx \
           -v /etc/group:/etc/group:ro \
           -v /etc/passwd:/etc/passwd:ro \
           --user=$USER \
           debian:jessie


Не уверен что это в общем случае достаточно безопастный способ, но он определенно самый простой и безболезенный если на хосте linux.
Ответ написан
@IgorOhrimenko
Исследование всех вариантов: https://jtreminio.com/blog/running-docker-containe...
Решение: https://github.com/lebokus/docker-volume-bindfs
Ответ написан
Комментировать
@tability7
посмотри в сторону bindfs
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы