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.
Ответы:
Отвечая на свой вопрос: заявлено, что это том. Если вы удалите инструкцию VOLUME, команда вступит в силу.
Более того, если вы объявите громкость после запуска chown, настройки chown останутся в силе.
источник
VOLUME
указано послеRUN
команды, которая изменяет том], докер достаточно умен, чтобы скопировать любые файлы, которые существуют в образе под подключением тома, в том и правильно установить владельца. Это победило Этого не произойдет, если вы укажете каталог хоста для тома (чтобы файлы хоста не были случайно перезаписаны) »,В этом блоге http://container42.com/2014/11/03/docker-indepth-volumes/ подробно объясняется это поведение.
Каждая инструкция в Dockerfile создает новый контейнер. Инструкция внесет некоторые изменения в этот контейнер и станет новым слоем. Изменения, внесенные в "/ var / local / testrunner / logs" до инструкции VOLUME, были внесены в фактическую файловую систему контейнера. Однако после инструкции VOLUME каталог «/ var / local / testrunner / logs» является смонтированным каталогом. Изменения, внесенные в этот каталог после инструкции VOLUME, будут применяться к смонтированному каталогу, а не к фактической файловой системе контейнера.
источник
Для тех, кто испытывает эту проблему без томов , я нашел запутанный обходной путь.
Проблема:
С помощью простого файла Dockerfile следующим образом:
После запуска:
Результат был:
Как видите, право собственности на файл (например, test_file.txt) по-прежнему связано с пользователем
root
.Решение:
Я обнаружил, что если бы я использовал числовой UID в
chown
команде, я мог бы изменить владельца, но только если UID не был 1000. Поэтому я добавил 1 к UID,new_user
а затем изменил владельца.После запуска:
Результат был:
Я не уверен, почему у меня вообще возникла эта проблема. Однако, поскольку похоже, что у других была эта проблема, я решил опубликовать свой обходной путь. Моим вариантом использования было создание контейнера докеров, который обслуживал записную книжку jupyter. Я создал пользователя без полномочий root для обслуживания ноутбука.
источник
По моему опыту,
chown
не работает при монтировании в root (VOLUME /test
). Используйте не корневой каталог (VOLUME /var/test
).источник
Для пользователей Alpine Linux мне приходилось работать
chown -R root .
в той рабочей области, которой я пытался владеть. Это нужно было сделать вCMD
файле dockerfile, так как я считаю, что при монтировании тома могут быть перезаписаны файлы.источник