Подтвердить что ты не робот

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

My Dockerfile создает каталог, chown его и затем перечисляет каталог позже. Каталог по-прежнему принадлежит 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 version 1.2.0, build fa7b24f

Хост запускает Ubuntu 12.04, но с ядром 3.13.0-36.

4b9b3361

Ответ 1

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

Что еще, если вы объявляете том после запуска chown, настройки chown остаются в силе.

Ответ 2

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

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

Ответ 3

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