Как изменить разрешение папки на 777 в Dockerfile?

У меня есть каталог проекта, подобный этому:

|-var/www|-docker-compose.yml|-app|--uploads|---photos|-Dockerfile

Это мой docker-compose.yml файл:

myapp:    build:      context: myfolder      dockerfile: Dockerfile    container_name: flask    image: api/v1:01    restart: unless-stopped    environment:      APP_ENV: "prod"      APP_DEBUG: "False"      APP_PORT: 5000    volumes:      - appdata:/var/www

Чего я хочу: Я хочу измениться app/uploads/photos разрешение этой папки на 777.Это папка для загрузки, поэтому пользователь может загружать файлы в эту папку.

Мой Dockerfile теперь это выглядит так:

FROM python:3.6.8-alpine3.9ENV GROUP_ID=1000 \    USER_ID=1000WORKDIR /var/www/ADD . /var/www/RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-devRUN pip install --upgrade pipRUN pip install -r requirements.txtRUN addgroup -g $GROUP_ID wwwRUN adduser -D -u $USER_ID -G www www -s /bin/shUSER wwwEXPOSE 5000

Посмотрев в этом вопрос, Чтобы достичь того, чего я хочу, я попробовал ниже:

FROM python:3.6.8-alpine3.9ENV GROUP_ID=1000 \    USER_ID=1000WORKDIR /var/www/ADD . /var/www/RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-devRUN pip install --upgrade pipRUN pip install -r requirements.txtRUN addgroup -g $GROUP_ID wwwRUN adduser -D -u $USER_ID -G www www -s /bin/shRUN chown -R www:www /var/wwwRUN chmod -R 777 /var/www/uploadsRUN chmod -R 777 /var/www/uploads/photosUSER wwwEXPOSE 5000

Но, похоже, что chmod команда в моем dockerfile не вступает в силу.Потому что всякий раз, когда я загружаю некоторые файлы в app/uploads/photos в моем коде, моем nginx сервер продолжает получать эту ошибку:

PermissionError: [Errno 13] Permission denied: '/var/www/uploads/photos/myfilename.png'

Кто-нибудь, пожалуйста, помогите.Пожалуйста, предоставьте решение о том, как изменить разрешение папки в Dockerfile.

ОБНОВЛЕНИЕ:

Я попытался изменить разрешение /var/www/uploads после сборки контейнера и запуска контейнера выполните следующие действия:

docker exec -it myapp /bin/sh

затем беги

chmod -R 777 /var/www/uploads

То, что я получаю, это chmod: /var/www/uploads: Operation not permitted

Поэтому я подозреваю, что эта ошибка также возникнет при сборке docker, а затем в соответствии с этот ответ от serverfault, я попытался изменить dockerfile на этот:

FROM python:3.6.8-alpine3.9ENV GROUP_ID=1000 \    USER_ID=1000WORKDIR /var/www/ADD . /var/www/USER rootRUN chmod -R 777 /var/www/uploadsRUN addgroup -g $GROUP_ID wwwRUN adduser -D -u $USER_ID -G www www -s /bin/shUSER wwwRUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-devRUN pip install --upgrade pipRUN pip install -r requirements.txtEXPOSE 5000

Но это все равно не работает. Но, похоже, мой вышеприведенный подход тоже неверен.Потому что я уже бегу в root в dockerfile. Но в то же время, когда я получаю доступ к контейнеру в хосте с помощью docker exec, также получая Operation not permitted.

Я очень новичок в Docker.Просто не могу понять, как это сделать.

Что я надеюсь узнать:

1) Как изменить папку var/www/uploads к разрешению 777?

2) В чем проблема, из-за которой я не могу изменить разрешение в своем подходе?

3) Каков лучший способ добиться этого? (Если таковые имеются)

Вы действительно не должны устанавливать 777, вероятно , было бы лучше просто сменить владельца этого каталога на www счет.

В любом случае ваши изменения в Dockerfile действительно не имеют значения, потому что у вас есть том (appdata:/var/www) это означает, что разрешения, которые у вас есть на изображении, маскируются вашим томом.

Ваш docker exec -it myapp /bin/sh будет сбой, потому что это изображение выполняется как www который не сможет запустить chmod в файле, не принадлежащем www.

В любом случае попробуйте просто временно отобразить объем на другое изображение. Сделайте что-то вроде docker run --rm -it -v appdata:/var/www debian:buster-slim чтобы начать интерактивный сеанс с образом Debian с подключенным томом. Этот образ по умолчанию запускается от имени root, поэтому вы должны иметь возможность изменять / исправлять разрешения в томе. Вы также могли бы передать --user опция, когда при запуске вашего docker exec.

Это уже есть в принятом ответе, но давайте все же укажем на это отдельно, с дополнительным акцентом: вы должны ** в принципе never использовать chmod 777 ** - это небезопасно и неуклюже.