如何在Dockerfile中将文件夹的权限更改为777?

ken*_*ken 5 linux permissions nginx file-permissions docker

我有一个这样的项目目录:

|-var/www
|-docker-compose.yml
|-app
|--uploads
|---photos
|-Dockerfile
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

我想要的: 我想更改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
Run Code Online (Sandbox Code Playgroud)

查看此问题后,为了实现我想要的目标,我尝试了以下操作:

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
Run Code Online (Sandbox Code Playgroud)

但似乎chmod我的 dockerfile 中的命令没有生效。因为每当我将一些文件上传到app/uploads/photos我的代码中时,我的nginx服务器不断收到此错误:

PermissionError: [Errno 13] Permission denied: '/var/www/uploads/photos/myfilename.png'
Run Code Online (Sandbox Code Playgroud)

有人请帮忙。请提供如何更改 中文件夹权限的解决方案Dockerfile

更新:

/var/www/uploads我尝试通过执行以下操作来更改构建容器后的权限并且容器正在运行:

docker exec -it myapp /bin/sh
Run Code Online (Sandbox Code Playgroud)

然后运行

chmod -R 777 /var/www/uploads
Run Code Online (Sandbox Code Playgroud)

我得到的是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
Run Code Online (Sandbox Code Playgroud)

但它仍然不起作用。但似乎我上面的方法也是错误的。因为我已经在运行了rootdockerfile但同时,当我使用主机访问容器时docker exec,也得到了Operation not permitted

我对 Docker 很陌生。只是不知道如何完成这项工作。

我希望知道的是:

1)如何将文件夹var/www/uploads权限改为777?

2)是什么问题导致我无法更改我的方法的权限?

3)实现这一目标的更好方法是什么?(如有)

Zor*_*che 5

您确实不应该设置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 时传递该选项。