В докере файлы, созданные внутри контейнеров, имеют тенденцию иметь непредсказуемое владение при проверке их с хоста. Владельцем файлов на томе по умолчанию является root (uid 0), но как только учетные записи пользователей без полномочий root включаются в контейнер и записывают в файловую систему, владельцы становятся более или менее случайными с точки зрения хоста.
Это проблема, когда вам нужно получить доступ к данным тома с хоста, используя ту же учетную запись пользователя, которая вызывает команды докера.
Типичные обходные пути:
- принудительное использование uID пользователей во время создания в Dockerfiles (не переносится)
- передача UID пользователя хоста
docker run
команде в качестве переменной среды, а затем выполнение некоторыхchown
команд на томах в сценарии точки входа.
Оба эти решения могут дать некоторый контроль над фактическими разрешениями вне контейнера.
Я ожидал, что пространства имен пользователей станут окончательным решением этой проблемы. Я провел несколько тестов с недавно выпущенной версией 1.10 и параметром --userns-remap для моей учетной записи рабочего стола. Однако я не уверен, что это может упростить владение файлами на смонтированных томах, я боюсь, что на самом деле может быть наоборот.
Предположим, я запустил этот базовый контейнер
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
А затем проверьте содержимое хоста:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
Этот номер «100000» является суб-UID моего пользователя хоста, но поскольку он не соответствует UID моего пользователя, я все еще не могу редактировать test.txt без прав. Этот субпользователь, похоже, не имеет ничего общего с моим фактическим постоянным пользователем за пределами докера. Это не отображается на карте.
Обходные пути, упомянутые ранее в этом посте, которые заключались в выравнивании UID между хостом и контейнером, больше не работают из-за UID->sub-UID
сопоставления, которое происходит в пространстве имен.
Тогда есть ли способ запустить докер с включенным пространством имен пользователей (для повышения безопасности), при этом позволяя пользователю хоста, запускающему докер, владеть файлами, созданными на томах?