чому чоун не працює в Dockerfile?


84

Мій Dockerfile створює каталог, задає його, а потім перелічує каталог. Каталог все ще належить root. Чому так?

Ось файл Docker:

FROM ubuntu:precise
RUN useradd -d /home/testuser -m -s /bin/bash testuser
RUN mkdir -p /var/local/testrunner/logs
VOLUME ["/var/local/testrunner/logs"]
RUN grep testuser /etc/passwd
RUN grep root /etc/passwd
RUN chown -R testuser:testuser /var/local/testrunner/logs
RUN ls -ld /var/local/testrunner/logs 

Ось вихідні дані від "docker build":

Sending build context to Docker daemon 10.24 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:precise
 ---> ab8e2728644c
Step 1 : RUN useradd -d /home/testuser -m -s /bin/bash testuser
 ---> Using cache
 ---> 640f12671c86
Step 2 : RUN mkdir -p /var/local/testrunner/logs
 ---> Using cache
 ---> bf7756fd5b1f
Step 3 : VOLUME ["/var/local/testrunner/logs"]
 ---> Using cache
 ---> 65c73ee76c20
Step 4 : RUN grep testuser /etc/passwd
 ---> Using cache
 ---> db72fff0b965
Step 5 : RUN grep root /etc/passwd
 ---> Running in ebff78df7a9a
root:x:0:0:root:/root:/bin/bash
 ---> ead0ff704a59
Removing intermediate container ebff78df7a9a
Step 6 : RUN chown -R testuser:testuser /var/local/testrunner/logs
 ---> Running in c925f67b2ab4
 ---> 253132be935e
Removing intermediate container c925f67b2ab4
Step 7 : RUN ls -ld /var/local/testrunner/logs
 ---> Running in 978bc66aa47e
drwxr-xr-x 2 root staff 4096 Oct  1 15:15 /var/local/testrunner/logs

Docker версії 1.2.0, збірка fa7b24f

Хост працює під управлінням Ubuntu 12.04, але із загальним ядром 3.13.0-36.


2
Питання , пов'язані з onership після COPY, см: stackoverflow.com/questions/44766665 / ...
Це бразильський хлопець

Відповіді:


125

Відповідаючи на власне запитання: це оголошено як том. Якщо ви видалите інструкцію VOLUME, чаун набере чинності.

Більше того, якщо ви оголосите гучність після запуску chown, налаштування chown залишаться в силі.


17
"Якщо ви оголосите гучність після запуску чауна, налаштування чауна залишаються в силі" Це просто відповіло на те, що мене запнуло протягом двох днів. Дякую!
CashIsClay

2
Відповідаючи собі: Пояснення тут мало сенс для мене container-solutions.com/2014/12/understanding-volumes-docker
Michael Härtl

4
Важливий момент із цієї статті вище: "[Коли VOLUMEвказано після RUNкоманди, яка змінює том], Docker досить розумний, щоб скопіювати всі файли, що існують на зображенні під монтом тому, у том і правильно встановити право власності. Це виграло не трапляється, якщо ви вказали хост-каталог для тому (щоб файли хостів випадково не перезаписувались) ".
Гезим,

2
Оновлена ​​URL-адреса для пояснення, яку посилає @ MichaelHärtl: blog.container-solutions.com/understanding-volumes-docker
Kamafeather

4
Я не заявляю жодного ОБ'ЄМУ у своєму докер-файлі і все ще маю цю проблему ... :-(
fccoelho

8

Цей блог http://container42.com/2014/11/03/docker-indepth-volumes/ детально пояснює цю поведінку.

Кожна інструкція в Dockerfile створює новий контейнер. Інструкція вносить деякі зміни в цей контейнер і стає новим шаром. Зміни, внесені до "/ var / local / testrunner / logs" перед вказівкою VOLUME, були внесені у фактичну файлову систему контейнера. Однак після інструкції VOLUME каталог "/ var / local / testrunner / logs" є змонтованим каталогом. Зміни, внесені до цього каталогу після інструкції VOLUME, застосовуватимуться до змонтованого каталогу, а не до фактичної файлової системи контейнера.


2

Для тих, хто стикається з цією проблемою без томів , я знайшов заплутану роботу.

Проблема:

За допомогою простого файлу Docker наступним чином:

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
COPY test_file.txt /home/new_user
RUN chown -R new_user:new_user /home/new_user
CMD ls -RFlag /home

Після запуску:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

Результатом було:

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:39 ../
drwxr-xr-x 1 root 4096 Jun 15 21:39 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 root 4096 Jun 15 21:39 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 root  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 root 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 root  655 Jul 12  2019 .profile
-rw-r--r-- 1 root   28 Jun 11 19:48 test_file.txt

Як бачите, право власності на файл (наприклад, test_file.txt) все ще пов'язане з користувачем root.

Рішення:

Я виявив, що якби я використав числовий UID в chownкоманді, я міг би змінити право власності, але лише якщо UID не був 1000. Тож я додав 1 до UID new_userі змінив право власності.

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
# change the uid of new_user to ensure it has whatever it was assigned plus 1 (e.g. if UID was 1000, now it'll be 1001)
RUN id -u new_user | awk '{print $1+1}' | xargs -I{} usermod -u {} new_user
COPY test_file.txt /home/new_user
RUN id -u new_user | xargs -I{} chown -R {}:{} /home/new_user
CMD ls -RFlag /home

Після запуску:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

Результатом було:

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
drwxr-xr-x 1 1001 4096 Jun 15 21:37 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 1001 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 1001  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 1001 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 1001  655 Jul 12  2019 .profile
-rw-r--r-- 1 1001   28 Jun 11 19:48 test_file.txt

Я не впевнений, чому у мене спочатку виникла ця проблема. Однак, оскільки, схоже, у інших була ця проблема, я подумав, що опублікую своє рішення. Моїм випадком використання було створення контейнера докера, який обслуговував блокнот jupyter. Я створив некорневого користувача для обслуговування блокнота.


1

З мого досвіду, chownне працює при монтажі на root ( VOLUME /test). Використовуйте некореневе розташування ( VOLUME /var/test).


0

Для користувачів Alpine Linux мені доводилося робити chown -R root .у робочій області, якою я намагався володіти. Це потрібно було зробити у CMDдокер-файлі, оскільки я вважаю, що кріплення томів можуть перезаписати файли під час монтування

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.