Chmod неправильно работает в Docker

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

#DockerfileFROM php:7-apacheRUN apt-get update \&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \&& docker-php-ext-install intl mbstring \&& a2enmod rewriteCOPY app/php.ini /usr/local/etc/php/COPY app/apache2.conf /etc/apache2/apache2.confCOPY ./ /var/www/htmlRUN 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 из bash контейнера, проблемы с разрешениями apache исчезают, и приложение работает хорошо

Ситуация

Выполнение команд chmod из dockerfile: разрешения изменены, но apache по-прежнему жалуется на отказ в разрешении.Запуск chmod тех же команд с помощью bash внутри контейнера: разрешения изменены, и мое приложение запущено

Есть идеи, я что-то упускаю, может быть, мне следует добавить пользователя root где-нибудь в Dockerfile?

У меня была такая же проблема, и кажется, что в 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.

Попробуйте добавить :

USER root

У меня это сработало.

Оболочкой ЗАПУСКА в Docker по умолчанию является /bin/sh, и именно здесь на самом деле возникает проблема с неправильной установкой разрешений.

Но вы можете вместо этого просто использовать / bin / bash, чтобы легко исправить, обратите внимание на список каталогов до и после

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'---> Running in dc57ae77aa67drwxr-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.jardrwxr-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

Эта проблема, вероятно, является результатом VOLUME определение внутри вышестоящего файла Dockerfile. Когда том определен в Dockerfile, вы можете добавлять файлы с COPY или ADD вводите команду непосредственно в изображение. Однако, в RUN линия будет:

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

Из-за такого поведения у вас есть возможность:

  1. вы можете скопировать свои файлы в другой каталог и изменить там разрешения
  2. вы можете исправить разрешения на своем хосте, чтобы они копировались непосредственно с этими разрешениями
  3. вы можете удалить объем либо из своего изображения, получить исходное изображение, чтобы удалить их определение объема, либо вы можете перестроить свою собственную копию исходного изображения без определения объема и основывать свои изображения на этом

Обратите внимание, что внутри текущих изображений php, похоже, что том был удален, что означает, что у нас фактически есть вариант 3.

Я только что провел эксперимент со следующим:

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

И это просто отлично работает.

Однако

Когда я переопределяю этот исполняемый файл с помощью docker-compose volumes, execute разрешение просто похоже на откат - технически отменено на исходное разрешение файла.

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

Хорошо… Я отредактировал вопрос :slight_smile:

Я вижу дополнительный пробел в вашей последней команде (я нахожусь на своем телефоне, поэтому не могу быть уверен). Поскольку проблема с разрешением, по-видимому, связана с каталогом журнала, измените последнюю строку на: ЗАПУСТИТЕ chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

это дополнительное место было опечаткой

Вы решили эту проблему?

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

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