chmod не працює належним чином у Docker


19

Я будую зображення Docker для свого Symfonyдодатка, і мені потрібно дати дозвіл серверу apache писати в папки кеша і журналу

#Dockerfile
FROM php:7-apache

RUN apt-get update \
&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite

COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html

RUN find /var/www/html/ -type d -exec chmod 755 {} \; 
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Коли я будую це зображення з docker build -t myname/symfony_apps:latest .і запускаю контейнер із docker run -p 8080:80 myname/symfony_apps:latest. Журнал Apache заповнений помилками, у яких відмовлено у дозволі. Дивна річ, яку я перевірив, ls -aта дозволи, чудово. і коли я запускаю chmod з баш-файлу контейнера, проблеми з дозволом apache зникають, і додаток працює добре

Ситуація

Запуск команд chmod з dockerfile: дозволи змінюються, але apache все ще скаржиться на відмову в дозволі. Запускаються однакові команди chmod з bash всередині контейнера: дозволи змінюються, і моя програма працює

Будь-яка ідея, чи мені щось не вистачає, можливо, я повинен додати root користувача десь у Dockerfile?


Було б корисно переглянути вашу команду docker, яка виконує вбудоване зображення.
Майк

Я бачу додаткове місце у вашій останній команді (я в телефоні, тому не можу бути впевнений). Оскільки здається, що проблема з дозволом пов'язана з каталогом журналів, змініть останній рядок на: `` `RUN chmod -R 777 / var / www / html / app / cache / var / www / html / app / logs` ``
Майк

1
Гаразд .. Я відредагував питання :)
шторм

що додатковий простір помилка
буря

Я не в змозі відтворити вашу проблему. Якщо я використовую ваш dockerfile і локально встановлюю кілька фіктивних файлів, дозволи є правильними, і все працює просто. Я можу завантажувати контейнер і отримувати доступ до вмісту через веб-браузер. Чи можете ви оновити своє запитання, щоб включати конкретні повідомлення про помилки? Ви впевнені, що ваша конфігурація Apache ( apache2.conf) не викликає проблем? Чи помиляються помилки, якщо ви не встановлюєте apache2.conf?
larsks

Відповіді:


16

У мене була така ж проблема, і, схоже, є помилка в docker або overlay2, якщо вміст каталогів створюється в одному шарі, а його дозволи змінюються в іншому.

Як вирішення, ви можете скопіювати джерела у тимчасовий каталог:

COPY . /src

А потім перемістіть його до /var/www/htmlта налаштуйте дозволи (в одній RUNкоманді):

RUN rm -rf /var/www/html && mv /src /var/www/html &&\
    find /var/www/html/ -type d -exec chmod 755 {} \; &&\
    find /var/www/html/ -type f -exec chmod 644 {} \; &&\
    chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Також я створив випуск GitHub .


Я збирався зануритися у свій старий вихідний код цієї ночі, щоб побачити, як я це вирішив, тоді я згадав про трюк каталогу tmp. Сподіваюся, це не знадобило вам багато часу, щоб вирішити XD
штурм

7

Оболонка RUN за замовчуванням у Docker є / bin / sh, і саме тут дозволу, неправильно встановлені, насправді є проблема.

Але ви можете змінити просто / bin / bash замість того, щоб легко виправити, помітити до та після переліку каталогів

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'
---> Running in dc57ae77aa67

drwxr-xr-x. 3 root root      103 Mar  8 17:56 .
drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar

drwxr-xr-x. 1 root root       42 Mar  8 17:56 .
drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
---> 8b5de6e348d3

2
Чому /bin/bash -c 'chmod +x file'працює, а ні /bin/sh -c 'chmod +x file'?
шторм

ваше краще рішення. це працювало для мене. Дякую .
користувач1427944

Також використання нового buildkit допомагає в ряді областей, включаючи цю. Спробувати. docs.docker.com/develop/develop-images/build_enhancements
Тад

6

Спробуйте додати:

USER root

Це працювало для мене.


Це має бути прийнятою відповіддю.
Володимир

2
Якщо ви переходите на root, вам, ймовірно, слід перейти до попереднього користувача, коли ви закінчите, або ви зменшуєте безпеку та сумісність контейнера. Деякі реалізації Kubernetes за замовчуванням, наприклад, не запускають контейнер як корінь.
мерехтіння

2

Ця проблема, ймовірно, є результатом VOLUMEвизначення всередині Dockerfile. Коли в Dockerfile визначено гучність, ви можете додавати файли за допомогою COPYабо ADDкоманду безпосередньо у зображення. Однак RUNлінія буде:

  • Створіть тимчасовий контейнер, використовуючи визначення зображення від поточної точки dockerfile
    • Цей тимчасовий контейнер матиме анонімний том, встановлений як ви або батьківське зображення, вказане всередині Dockerfile
    • Анонімний том буде ініціалізований із вмісту зображення
  • Ваша команда запуститься всередині контейнера
    • Якщо ви перерахуєте каталог під час цієї RUNкоманди, ви побачите застосовані зміни, але ці зміни були застосовані до тома
  • Коли команда запуску завершиться, докер буде фіксувати зміни контейнера
    • Ці зміни можна побачити, docker diffякщо ви не видаляєте тимчасові контейнери (ви можете запустити збірку, --rm=falseщоб вони залишилися)
    • Ці зміни не включатимуть вміст анонімного тома, оскільки вони не існують всередині тимчасової файлової системи контейнерів, томи є окремими

Через таку поведінку у вас є варіанти:

  1. ви можете скопіювати свої файли в інший каталог та змінити там дозволи
  2. ви можете виправити дозволи на своєму хості, щоб вони скопіювалися безпосередньо з цими дозволами
  3. ви можете видалити гучність з будь-якого зображення, отримати зображення вгорі за течією, щоб видалити їх визначення обсягу, або ви можете відновити власну копію зображення вгорі за течією без визначення обсягу та базувати зображення на цьому

Зауважте, що всередині поточних зображень PHP виявляється, що гучність видалено, а це означає, що у нас фактично є варіант 3.


0

Я щойно зробив експеримент із наступним:

FROM alpine

LABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"
RUN apk add --no-cache inotify-tools
CMD [ "./script.sh" ]
WORKDIR /opt/app/
COPY src/ /opt/app/
RUN chmod a+x *.sh

І це просто чудово працює.

Однак

Коли я переосмислюю цей виконуваний файл через томери докер-композиції, executeдозвіл просто схожий на відкат - технічно переорієнтований на вихідний дозвіл файлу.

Виправлення режиму розробок просто chmod a+x yourfileвід хоста, який буде успадкований при монтажі композитного гучності.


1
Вся мета тома - монтувати файли з іншого місця, ніж зображення, тож якщо ви виправите зображення та змонтуєте гучність поверх цього, за дизайном ви не побачите змін у вашому зображенні. Залежно від того, чому у вас гучність, відповідь може бути просто не мати гучності.
BMitch

Так, BMitch , я повністю згоден, що стосується ефекту монтажу об'єму, який переосмислює контейнер fs з вбудованого в docker зображення, але ... Під час розробки ви напевно не хочете перебудовувати / перезавантажувати контейнер, щоб перевірити кожну зміну, яку ви робити. У цьому останньому сценарії ви хочете, щоб він монтував об'єм, який переосмислює вбудований докер-образ image fs. І я зіткнувся з тим же питанням, перш ніж приземлитися тут. Я не був засуджений жодними відповідями на пояснення і перевіряв кожне з них. Лише тоді я зрозумів, що відбувається, і розмістив свої спостереження ...
Салатієль Генез

... і я підозрюю, що сценарій, який я пережив, такий самий, як у того, хто задав питання.
Salathiel Genèse

ОП вказали, що бачили проблему лише з docker runкомандою та без зовнішніх кріплень гучності.
BMitch

На жаль - я пропустив цей аспект ... Правильна відповідь на правильну назву питання, але не описаний сценарій. Тоді, можу зазначити, що я не міг відтворити вищезгадане питання.
Salathiel Genèse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.