Задать вопрос
@Nolan81
программист

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

Приветствую.
Есть такой docker-compose.yml
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


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

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

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

Спасибо.
  • Вопрос задан
  • 141 просмотр
Подписаться 1 Простой 3 комментария
Решения вопроса 1
rqdkmndh
@rqdkmndh
Web-разработчик
Изменение прав доступа к папке в 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"]

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

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

Войдите, чтобы написать ответ

Похожие вопросы