Как добавить файл в Docker-контейнер, у которого нет корневых прав?

16

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

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
Ньи
источник

Ответы:

20

Вероятно, есть способ просмотреть и изменить Dockerfile для tomcat, но я не могу понять это через несколько минут. Мое неумелое решение состоит в том, чтобы добавить эту строку перед chown:

USER root

Если вы хотите отменить привилегии после (что рекомендуется), вы можете добавить эту строку:

USER tomcat

Кроме того, работайте с образом, на котором не установлено программное обеспечение, поэтому вы можете запустить Dockerfile как root и установить tomcat и все такое. Это на самом деле странно, что они меняют это в своем образе из моего опыта. Имеет смысл разрешить конечному пользователю задавать директиву USER по своему усмотрению.

theterribletrivium
источник
Это действительно работает! Знаете ли вы случайно, почему команды ADD и COPY создают файлы с владельцем root? Почему они не принимают USERдирективу во внимание?
Ньи
1
Ну, обычно вы не видите, что базовые образы задают директиву, поскольку нет реального способа узнать, какие учетные записи пользователей будут в системе. Также может быть проще просто создать файлы с правами суперпользователя, поскольку Docker должен их запускать. Это выглядит как разумный запрос на усовершенствование, он упростил бы сборку Dockerfiles, если бы вещи могли автоматически принадлежать тому, что было установлено в директиве USER.
theterribletrivium
Спасибо. Действительно избавь меня от страданий. Мне нужно было добавить ключи SSH в образе Дженкинса.
Костас Демирис
8

Начиная с Docker 17.09, можно использовать --chownфлаг для операций ADD / COPY в Dockerfile, чтобы изменить владельца в самом шаге ADD / COPY, а не в отдельной операции RUN с chown, который, как вы заметили, увеличивает размер изображения. Было бы хорошо иметь это как режим по умолчанию, то есть права пользователя, копирующего файлы, применяются к скопированным файлам. Однако команда Docker не хотела нарушать обратную совместимость и поэтому ввела новый флаг.

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

Другие альтернативы:

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