Розглянемо такий тривіальний Dockerfile:
FROM debian:testing
RUN adduser --disabled-password --gecos '' docker
RUN adduser --disabled-password --gecos '' bob
у робочому каталозі ні з чим іншим. Створіть образ докера:
docker build -t test .
а потім запустіть скрипт bash на контейнері, зв’язавши робочий каталог з новим підкаталогом домашнього каталогу bob:
docker run --rm -it -v $(pwd):/home/bob/subdir test
Кому належить вміст subdir
контейнера? На контейнері запустіть:
cd /home/bob/subdir
ls -l
Оголошення, яке ми бачимо:
-rw-rw-r-- 1 docker docker 120 Oct 22 03:47 Dockerfile
Святі дими! docker
володіє вмістом! Повернувшись на хост-машині поза контейнером, ми бачимо, що наш початковий користувач все ще володіє Dockerfile
. Давайте спробуємо виправити право власності на bob
домашній каталог. На контейнері запустіть:
chown -R bob:bob /home/bob
ls -l
і ми бачимо:
-rw-rw-r-- 1 bob bob 120 Oct 22 03:47 Dockerfile
Але почекай! за межами контейнера, ми тепер запускаємоls -l
-rw-rw-r-- 1 1001 1001 120 Oct 21 20:47 Dockerfile
ми більше не володіємо власним файлом. Страшні новини!
Якби ми додали лише одного користувача у наведеному вище прикладі, все пройшло б більш гладко. З якоїсь причини Docker, здається, створює будь-який домашній каталог, що належить першому некореневому користувачеві, якого він зустрічає (навіть якщо цей користувач оголошений на попередньому зображенні). Так само, цей перший користувач відповідає тим самим дозволам власності, що і мій домашній користувач.
Питання 1 Чи правильно? Хтось може вказати мені документацію на це, я просто припускаю, спираючись на вищезазначений експеримент.
Запитання 2 : Можливо, це просто тому, що вони обидва мають одне і те ж числове значення в ядрі, і якби я тестував у системі, де мій домашній користувач не був ідентифікатором, 1000
тоді дозволи змінювались би в кожному випадку?
Питання 3 : Справжнє питання, звичайно, "що я з цим роблю?" Якщо bob
ви ввійшли як bob
на даній хост-машині, він повинен мати можливість запускати контейнер як bob
і не мати дозволів на файли, змінених під своїм обліковим записом хоста. По суті, йому фактично потрібно запустити контейнер як користувач, docker
щоб уникнути зміни облікового запису.
Я чую, як ви запитуєте, навіщо мені такий дивний Dockerfile? . Мені теж часом цікаво. Я пишу контейнер для веб-додатка (RStudio-сервер), який дозволяє різним користувачам входити, який просто використовує імена користувачів та облікові дані з машини Linux як дійсні імена користувачів. Це приносить мені, можливо, незвичну мотивацію бажання створити декількох користувачів. Я можу обійти це, створивши користувача лише під час виконання, і все добре. Однак я використовую базове зображення, яке додало одного docker
користувача, щоб його можна було використовувати в інтерактивному режимі, не виконуючи як root (згідно з найкращою практикою). Це руйнує все, оскільки цей користувач стає першимкористувач і в кінцевому підсумку володіє всім, тому намагається увійти в систему, оскільки інші користувачі зазнають невдачі (програма не може запуститись, оскільки їй бракує дозволів на запис). chown
Спочатку запущений сценарій запуску вирішує цю проблему, але ціною пов’язаних томів, що змінюють дозволи (очевидно, проблема лише в тому випадку, якщо ми пов’язуємо томи).