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

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

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

|-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?

2)什么问题导致我无法通过我的方法改变权限?

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

答案1

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

相关内容