Docker用户访问容器中的文件夹时拒绝权限

时间:2016-12-01 12:26:38

标签: django ubuntu docker pip docker-compose

我正在运行docker-compose以使用以下配置将django与其他一些服务集合在一起:

Dockerfile

FROM ubuntu:16.10
FROM python:3.5.0

ENV EXTRACTOR_SRC=.
ENV EXTRACTOR_SRVHOME=/srv
ENV EXTRACTOR_SRVPROJ=/srv/extractor_django

#Install package dependencies
RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y python python-pip virtualenvwrapper

# Create application subdirectories
WORKDIR $EXTRACTOR_SRVHOME
RUN mkdir media static logs
VOLUME ["$EXTRACTOR_SRVHOME/media/", "$EXTRACTOR_SRVHOME/logs/"]

# Copy application source code to SRCDIR
COPY $EXTRACTOR_SRC $EXTRACTOR_SRVPROJ

# Install Python dependencies
RUN pip install -r $EXTRACTOR_SRVPROJ/requirements.txt

# create user
RUN adduser --disabled-password --gecos '' dockeruser

(相关)Docker-compose.yml

version: '2'

services:

  # Django web server
  web:
     build:
         context: .
         dockerfile: Dockerfile
     hostname: web
     command: /srv/www/run_web.sh
     volumes:
          - .:/srv/www
     ports:
       - "8000:8000"

run_web.sh

#!/bin/bash
set -o verbose

sleep 15
cd /srv/extractor_django

su -m dockeruser -c "python manage.py makemigrations"
su -m dockeruser -c "python manage.py migrate"
su -m dockeruser -c "python manage.py collectstatic --noinput"

# Start Gunicorn processes
echo Starting Gunicorn.

su -m dockeruser -c "gunicorn extractorService.wsgi:application \
    --name extractor_django \
    --bind 0.0.0.0:8000 \
    --workers 10 \
    --log-level=info"

在运行时期间,其中一个python要求(spacy)尝试存储和访问受限文件夹中的文件,从而导致错误:

PermissionError: [Errno 13] Permission denied:       
'/usr/local/lib/python3.5/site-packages/spacy/data'

有没有办法可以为dockeruser提供足够的权限。或者,使用virtualenv运行它会更明智,因为问题似乎是访问系统范围的python文件夹?

2 个答案:

答案 0 :(得分:0)

你可以通过在Docker之外解决它的方式来解决这个问题。要么为该用户提供该文件夹/结构的适当权限,要么就像您说的那样可以使用virtualenv。

答案 1 :(得分:0)

您是否尝试使用privileged选项为容器提供扩展权限?

version: '2'

services:

  # Django web server
  web:
     build:
         privileged: true
         context: .
         dockerfile: Dockerfile
     hostname: web
     command: /srv/www/run_web.sh
     volumes:
          - .:/srv/www
     ports:
       - "8000:8000"