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)
但它仍然不起作用。但似乎我上面的方法也是错误的。因为我已经在运行了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 时传递该选项。
| 归档时间: |
|
| 查看次数: |
95586 次 |
| 最近记录: |