Назад | Перейти на главную страницу

chmod некорректно работает в Docker

Я создаю образ Docker для своего Symfony app, и мне нужно дать разрешение серверу 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 из контейнера 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

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

Оболочка 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

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

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

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

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

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

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

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

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

тем не мение

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

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