Як додати файл до контейнера докера, який не має кореневих прав?


16

Я намагаюся додати файл до зображення 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

Відповіді:


20

Існує певний спосіб перегляду та зміни Dockerfile для tomcat, але я не можу це зрозуміти через кілька хвилин. Моє неелегантне рішення - додати цей рядок перед чунним:

USER root

Якщо ви хочете зняти привілеї після (що рекомендується), ви можете додати цей рядок:

USER tomcat

Крім того, працюйте із зображенням, на якому не встановлено програмне забезпечення, щоб ви могли почати свій Dockerfile як root та встановити tomcat і все таке. Це насправді дивно, що вони змінюють їхній образ із мого досвіду. Має сенс дозволити кінцевому користувачу, який призначений, встановити директиву USER так, як вони вважають за потрібне.


Це справді працює! Чи випадково ви знаєте, чому команди ADD і COPY створюють файли з власником root? Чому вони не враховують USERдирективу?
nyi

1
Ну, як правило, ви не бачите базових зображень, що встановлюють директиву, оскільки немає реального способу дізнатися, які облікові записи користувачів будуть у системі. Також може бути простіше просто створити файли як root, оскільки саме так 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. Наріжте шарами!
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.