Linux

如何在 Dockerfile 中將文件夾的權限更改為 777?

  • March 14, 2020

我有一個這樣的項目目錄:

|-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.9

ENV GROUP_ID=1000 \
   USER_ID=1000

WORKDIR /var/www/
ADD . /var/www/

RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-dev
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

RUN addgroup -g $GROUP_ID www
RUN adduser -D -u $USER_ID -G www www -s /bin/sh

USER www

EXPOSE 5000

在查看這個問題之後,為了實現我想要的,我嘗試了以下內容:

FROM python:3.6.8-alpine3.9

ENV GROUP_ID=1000 \
   USER_ID=1000

WORKDIR /var/www/
ADD . /var/www/

RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-dev
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

RUN addgroup -g $GROUP_ID www
RUN adduser -D -u $USER_ID -G www www -s /bin/sh

RUN chown -R www:www /var/www
RUN chmod -R 777 /var/www/uploads
RUN chmod -R 777 /var/www/uploads/photos


USER www

EXPOSE 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.9


ENV GROUP_ID=1000 \
   USER_ID=1000

WORKDIR /var/www/
ADD . /var/www/

USER root
RUN chmod -R 777 /var/www/uploads

RUN addgroup -g $GROUP_ID www
RUN adduser -D -u $USER_ID -G www www -s /bin/sh

USER www

RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-dev
RUN pip install --upgrade pip
RUN pip install -r requirements.txt


EXPOSE 5000

但它仍然不起作用。但似乎我上面的方法也是錯誤的。因為我已經在root中執行了dockerfile。但是同時,當我docker exec使用Operation not permitted.

我是 Docker 的新手。只是不知道如何完成這項工作。

我希望知道的:

1)如何將文件夾更改var/www/uploads為權限777?

  1. 是什麼問題導致我無法更改我的方法的權限?

3)實現這一目標的更好方法是什麼?(如果有)

您真的不應該設置777,最好將該目錄的所有權更改為www帳戶。

無論如何,您在 Dockerfile 中的更改真的無關緊要,因為您有一個卷 ( appdata:/var/www),這意味著您在映像中擁有的權限被您的捲所掩蓋。

docker exec -it myapp /bin/sh將失敗,因為該映像正在執行,www無法在不屬於www.

無論如何嘗試只是暫時將捲映射到另一個圖像。執行一些操作,例如docker run --rm -it -v appdata:/var/www debian:buster-slim啟動與映射卷的 Debian 映像的互動式會話。該映像預設以 root 身份執行,因此您應該能夠更改/修復卷中的權限。您也可以--user在執行 docker exec 時傳遞該選項。

引用自:https://serverfault.com/questions/1006938