Почему не назначаются разрешения на папку в volume-е?

Ссылка скопирована
1 ответ

Приветствую.
Есть такой docker-compose.yml

version: '2' services:   php:     build: .     volumes:       - ./web/uploads:/app/web/uploads:delegated     ports:       - '8000:80'

version: '2' services: php: build: . volumes: - ./web/uploads:/app/web/uploads:delegated ports: - '8000:80'

И такой ему Dockerfile:

FROM yiisoftware/yii2-php:8.1-apache COPY ./base.ini /usr/local/etc/php/conf.d/base.ini COPY . /app WORKDIR /app RUN composer install RUN chown -R www-data:www-data /app  RUN chmod o+w /app/web/uploads && chmod o+w /app/web/uploads/result

FROM yiisoftware/yii2-php:8.1-apache COPY ./base.ini /usr/local/etc/php/conf.d/base.ini COPY . /app WORKDIR /app RUN composer install RUN chown -R www-data:www-data /app RUN chmod o+w /app/web/uploads && chmod o+w /app/web/uploads/result

Смысл, что я клонирую репу с гитхаба, по умолчанию каталогу 'uploads' стоят права rwxrwxr-x (*) и пользователь мой в убунту.
Если поднимать приложение - docker compose up -d ,
эта папка uploads имеет внутри пользователя и группу 1000:1000, и права (*)

Почему то эта последняя строка в Dockerfile - RUN chmod o+w /app/web/uploads ...
вообще не работает.

Как такую проблему решить? Хотелось бы приложение только одной командой поднять, чтобы внутри докер сам выставил права.

Спасибо.

Дополнительно:

зачем пытаться изменить владельца папки, которая монтируется?

  • Виктор, владельца и не изменило. Мне нужно чтобы апач смог писать в эту папку
  • Михаил, это делается не так
  • Изменение прав доступа к папке в Dockerfile с помощью RUN chmod не действует на тома (volumes), примонтированные при помощи инструкции volumes в docker-compose.yml. Это связано с тем, что тома подключаются после выполнения всех команд указанных в Dockerfile, и их содержимое не изменяется в процессе построения образа, что означает, что фактические данные тома и права доступа управляются внешним хостом.

    Таким образом, для того чтобы установить нужные права, это должно быть сделано снаружи контейнера, на уровне вашей системы файлов хоста, и эти изменения будут отражены внутри контейнера за счет того, что папка примонтирована. Вы можете также установить права доступа непосредственно на хосте перед тем, как запустить контейнер, используя команды chown и chmod на машине хоста.

    Если же настройка прав доступа должна выполняться внутри контейнера (например, при инициализации или запуске), вы можете использовать команду entrypoint или command в docker-compose.yml для запуска скрипта, который будет устанавливать нужные права доступа при запуске контейнера каждый раз. Пример такого скрипта:

    # Dockerfile ...  # Установка прав доступа в скрипте инициализации COPY ./set-permissions.sh /usr/local/bin/set-permissions.sh RUN chmod +x /usr/local/bin/set-permissions.sh  # Запуск скрипта при старте контейнера ENTRYPOINT ["set-permissions.sh"] CMD ["apache2-foreground"]

    # Dockerfile ... # Установка прав доступа в скрипте инициализации COPY ./set-permissions.sh /usr/local/bin/set-permissions.sh RUN chmod +x /usr/local/bin/set-permissions.sh # Запуск скрипта при старте контейнера ENTRYPOINT ["set-permissions.sh"] CMD ["apache2-foreground"]

    bash:

    # set-permissions.sh #!/bin/bash chmod o+w /app/web/uploads chmod o+w /app/web/uploads/result exec "$@"

    # set-permissions.sh #!/bin/bash chmod o+w /app/web/uploads chmod o+w /app/web/uploads/result exec "$@"

    Этот скрипт изменит права на каталоги при каждом запуске контейнера, не зависимо от прав на машине хоста.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Кирилл JS Ответ

    Когда вы используете Docker и объявляете папку как volume в вашем контейнере, Docker не назначает разрешения на эту папку из-за того, что Docker не управляет файловой системой хоста. Вместо этого Docker просто монтирует эту папку в контейнере, сохраняя все права доступа и разрешения, которые уже существуют на хосте.

    Если у вас возникают проблемы с доступом к папке в volume-е, это может быть связано с различными факторами:

    1. **UID и GID**: Убедитесь, что UID и GID пользователя, запущенного в контейнере, соответствуют UID и GID пользователя на хосте. Если они не совпадают, это может вызвать проблемы с доступом к файлам.

    2. **Маскирование прав доступа**: Проверьте, что права доступа к папке и файлам позволяют пользователю в контейнере читать, записывать и выполнять необходимые операции. Иногда маскирование прав доступа может вызвать проблемы.

    3. **SELinux или AppArmor**: Если вы используете SELinux или AppArmor на хосте, это может ограничивать доступ к некоторым папкам. Убедитесь, что правильно настроены политики безопасности для разрешения доступа к папке.

    4. **Проблемы с монтированием**: Проверьте, что папка volume правильно примонтирована в контейнере. Иногда проблемы с монтированием могут привести к недоступности папки.

    Для того чтобы решить проблемы с доступом к папке в volume-е, убедитесь, что все вышеперечисленные факторы были проверены и настроены правильно. Если проблема все еще не решена, попробуйте перезапустить контейнер или пересоздать volume с новыми настройками доступа.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно