Как добавить файл в контейнер docker, у которого нет прав root?

Я пытаюсь добавить файл в образ Docker, созданный на основе официального tomcat изображение. Похоже, что у этого изображения нет прав root, так как я вошел в систему как пользователь tomcat если я запущу bash:

docker run -it tomcat /bin/bashtomcat@06359f7cc4db:/usr/local/tomcat$ 

Если я проинструктирую Dockerfile чтобы скопировать файл в этот контейнер, у файла есть разрешения 644 и владелец - это root. Насколько я понимаю, это кажется разумным, поскольку все команды в Dockerfile выполняются от имени root. Однако, если я попытаюсь сменить владельца этого файла на tomcat:tomcat, я получаю Operation not permitted ошибка.

Почему я не могу изменить права доступа к файлу, скопированному в это изображение?

Как это можно воспроизвести:

mkdir docker-addfilepermissioncd docker-addfilepermissiontouch test.txtecho 'FROM tomcatCOPY test.txt /usr/local/tomcat/webapps/RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfiledocker build .

Выход из docker build .:

Sending build context to Docker daemon 3.072 kBSending build context to Docker daemon Step 0 : FROM tomcat ---> 44859847ef64Step 1 : COPY test.txt /usr/local/tomcat/webapps/ ---> Using cache ---> a2ccb92480a4Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt ---> Running in 208e7ff0ec8fchown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted2014/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 и все такое. На самом деле странно, что они меняют это в своем образе, исходя из моего опыта. Имеет смысл разрешить предполагаемому конечному пользователю устанавливать пользовательскую директиву так, как он считает нужным.

Начиная с Docker 17.09 можно использовать --chown установите флажок для операций ДОБАВЛЕНИЯ / КОПИРОВАНИЯ в Dockerfile, чтобы изменить владельца на самом шаге ДОБАВЛЕНИЯ / КОПИРОВАНИЯ, а не на отдельной операции ЗАПУСКА с помощью chown, которая увеличивает размер изображения, как вы отметили. Было бы хорошо иметь это в качестве режима по умолчанию, т.е. к скопированным файлам применяются разрешения пользователя, копирующего файлы. Однако команда Docker не хотела нарушать обратную совместимость и поэтому ввела новый флаг.

COPY --chown=<user>:<group> <hostPath> <containerPath>

Другими альтернативами являются:

  1. Измените разрешение в промежуточной папке перед созданием образа.
  2. Запустите контейнер с помощью сценария начальной загрузки, который изменит владельца.
  3. Раздавите слои!