我有一个这样的项目目录:
|-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 时传递选项。