Почему не назначаются разрешения на папку в volume-е?
Приветствую.
Есть такой 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 "$@"
Этот скрипт изменит права на каталоги при каждом запуске контейнера, не зависимо от прав на машине хоста.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Когда вы используете Docker и объявляете папку как volume в вашем контейнере, Docker не назначает разрешения на эту папку из-за того, что Docker не управляет файловой системой хоста. Вместо этого Docker просто монтирует эту папку в контейнере, сохраняя все права доступа и разрешения, которые уже существуют на хосте.
Если у вас возникают проблемы с доступом к папке в volume-е, это может быть связано с различными факторами:
1. **UID и GID**: Убедитесь, что UID и GID пользователя, запущенного в контейнере, соответствуют UID и GID пользователя на хосте. Если они не совпадают, это может вызвать проблемы с доступом к файлам.
2. **Маскирование прав доступа**: Проверьте, что права доступа к папке и файлам позволяют пользователю в контейнере читать, записывать и выполнять необходимые операции. Иногда маскирование прав доступа может вызвать проблемы.
3. **SELinux или AppArmor**: Если вы используете SELinux или AppArmor на хосте, это может ограничивать доступ к некоторым папкам. Убедитесь, что правильно настроены политики безопасности для разрешения доступа к папке.
4. **Проблемы с монтированием**: Проверьте, что папка volume правильно примонтирована в контейнере. Иногда проблемы с монтированием могут привести к недоступности папки.
Для того чтобы решить проблемы с доступом к папке в volume-е, убедитесь, что все вышеперечисленные факторы были проверены и настроены правильно. Если проблема все еще не решена, попробуйте перезапустить контейнер или пересоздать volume с новыми настройками доступа.