почему chown не работает в Dockerfile?


85

My Dockerfile создает каталог, chown его, а затем перечисляет каталог. Каталог по-прежнему принадлежит пользователю root. Это почему?

Вот Dockerfile:

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

Докер версии 1.2.0, сборка fa7b24f

Хост работает под управлением Ubuntu 12.04, но с общим ядром 3.13.0-36.


2
Информацию о проблемах с персоналом после КОПИРОВАНИЯ см .: stackoverflow.com/questions/44766665/…
Этот бразильский парень

Ответы:


127

Отвечая на свой вопрос: заявлено, что это том. Если вы удалите инструкцию VOLUME, команда вступит в силу.

Более того, если вы объявите громкость после запуска chown, настройки chown останутся в силе.


18
«Если вы объявите громкость после запуска chown, настройки chown останутся в силе». Это просто ответ на вопрос, который поставил меня в тупик на два дня. Спасибо!
CashIsClay

2
Отвечая самому себе: объяснение здесь имело смысл для меня container-solutions.com/2014/12/understanding-volumes-docker
Michael Härtl

4
Важный момент из этой статьи выше: «[Когда VOLUMEуказано после RUNкоманды, которая изменяет том], докер достаточно умен, чтобы скопировать любые файлы, которые существуют в образе под подключением тома, в том и правильно установить владельца. Это победило Этого не произойдет, если вы укажете каталог хоста для тома (чтобы файлы хоста не были случайно перезаписаны) »,
Гезим,

2
Обновленный URL-адрес объяснения, на который ссылается @ MichaelHärtl: blog.container-solutions.com/understanding-volumes-docker
Kamafeather

5
Я не объявляю VOLUME в моем dockerfile, но проблема все еще возникает ... :-(
fccoelho

8

В этом блоге http://container42.com/2014/11/03/docker-indepth-volumes/ подробно объясняется это поведение.

Каждая инструкция в Dockerfile создает новый контейнер. Инструкция внесет некоторые изменения в этот контейнер и станет новым слоем. Изменения, внесенные в "/ var / local / testrunner / logs" до инструкции VOLUME, были внесены в фактическую файловую систему контейнера. Однако после инструкции VOLUME каталог «/ var / local / testrunner / logs» является смонтированным каталогом. Изменения, внесенные в этот каталог после инструкции VOLUME, будут применяться к смонтированному каталогу, а не к фактической файловой системе контейнера.


2

Для тех, кто испытывает эту проблему без томов , я нашел запутанный обходной путь.

Проблема:

С помощью простого файла Dockerfile следующим образом:

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. Я создал пользователя без полномочий root для обслуживания ноутбука.


1

По моему опыту, chownне работает при монтировании в root ( VOLUME /test). Используйте не корневой каталог ( VOLUME /var/test).


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.