Я пытаюсь добавить файл в образ Docker, созданный из официального tomcat
образ. У этого образа нет прав root, так как я вошел в систему как пользователь tomcat
если я запустил bash:
docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$
Если я проинструктирую Dockerfile
чтобы скопировать файл в этот контейнер, у файла есть разрешения 644
а владелец root
. Насколько я понимаю, это кажется разумным, поскольку все команды в Dockerfile запускаются от имени пользователя root. Однако, если я попытаюсь изменить владельца этого файла на tomcat:tomcat
, Я получаю Operation not permitted
ошибка.
Почему я не могу изменить права доступа к файлу, скопированному в это изображение?
Как это можно воспроизвести:
mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile
docker build .
Выход docker build .
:
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon
Step 0 : FROM tomcat
---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
---> Using cache
---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1
Вероятно, есть способ просмотреть и изменить файл Dockerfile для tomcat, но я не могу понять его через несколько минут. Мое неизящное решение - добавить эту строку перед chown:
USER root
Если вы хотите снизить привилегии после (что рекомендуется), вы можете добавить эту строку:
USER tomcat
В качестве альтернативы, работайте с образом, в котором не установлено программное обеспечение, чтобы вы могли запустить свой Dockerfile как root и установить tomcat и все такое. На самом деле странно, что они меняют это в своем имидже, исходя из моего опыта. Имеет смысл разрешить предполагаемому конечному пользователю устанавливать директиву USER по своему усмотрению.
Начиная с Docker 17.09 можно использовать --chown
флаг для операций ADD / COPY в Dockerfile, чтобы изменить владельца на самом шаге ADD / COPY, а не в отдельной операции RUN с помощью chown, которая увеличивает размер изображения, как вы заметили. Было бы хорошо, если бы это был режим по умолчанию, т.е. права пользователя, копирующего файлы, применяются к скопированным файлам. Однако команда Docker не хотела нарушать обратную совместимость и поэтому ввела новый флаг.
COPY --chown=<user>:<group> <hostPath> <containerPath>
Другие альтернативы: