Розглянемо такий тривіальний 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Спочатку запущений сценарій запуску вирішує цю проблему, але ціною пов’язаних томів, що змінюють дозволи (очевидно, проблема лише в тому випадку, якщо ми пов’язуємо томи).