Ответ 1
(Bind-mounted) тома в Docker будут поддерживать разрешения, которые установлены на хозяин Докера. Вы можете использовать это, чтобы установить разрешения для этих файлы и каталоги перед их использованием в контейнере.
Немного фона;
Разрешения в Linux основаны на идентификаторах пользователей и групп ('uid'
/'gid'
). Даже
хотя вы видите имя пользователя и группы как владельца, эти имена на самом деле не являются
важные в Linux, они доступны только для того, чтобы вам было легче узнать, кто является владельцем файла (они выглядят из файла /etc/passwd
).
Вы можете установить любой uid
/gid
в файл; пользователь не должен существовать при настройке этих разрешений. Например:
touch foobar && sudo chown 1234:5678 foobar && ls -la foobar
# UID and GID are set to 1234 / 5678, even though there no such user
-rw-rw-r-- 1 1234 5678 0 Mar 25 19:14 foobar
Проверка разрешений (внутри и снаружи контейнера)
Как упоминалось выше, Docker поддерживает право собственности на хост при использовании том. В этом примере показано, что разрешения и права собственности на томе являются как снаружи, так и внутри контейнера;
# (First create a dummy site)
mkdir -p volume-example/site && cd volume-example
echo "<html><body>hello world</body></html>" > site/index.html
# Permissions on the Docker host;
ls -n site
# total 4
# -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html
# And, permissions inside a nginx container, using it as volume;
sudo docker run --rm -v $(pwd)/site:/var/www nginx ls -n /var/www
# total 4
# -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html
Установка разрешений
Как объяснено, пользователю не обязательно существовать, чтобы использовать их, поэтому даже если
у нас нет пользователя www-data
на хосте Docker, мы все равно можем установить правильное
разрешений, если мы знаем "uid" и "gid" этого пользователя внутри контейнера;
Посмотрите, что в контейнере находится uid и gid пользователя www-data;
sudo docker run --rm nginx id www-data
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
Сначала проверьте состояние перед изменением разрешений. На этот раз мы
запустите контейнер nginx как пользователь www-data
;
sudo docker run \
--rm \
--volume $(pwd)/site:/var/www \
--user www-data nginx touch /var/www/can-i-write.txt
# touch: cannot touch `/var/www/can-i-write.txt': Permission denied
Затем установите разрешения в локальном каталоге и посмотрите, можем ли мы писать:
sudo chown -R 33:33 site
sudo docker run \
--rm \
--volume $(pwd)/site:/var/www \
--user www-data nginx touch /var/www/can-i-write.txt
Успех!