【问题标题】:How do I assign permissions in for the user in Docker?如何在 Docker 中为用户分配权限?
【发布时间】:2023-01-08 00:25:54
【问题描述】:

我正在尝试在 Docker 中运行我的 DjangoRestFramework 项目。这是我的部署脚本,我试图在部署到远程机器之前检查我的本地机器。 我能够使用成功构建容器

docker-compose -f docker-compose-deploy.yml build

但是当我尝试运行docker-compose -f docker-compose-deploy.yml up时,我得到一个 PermissionError: [Errno 13] Permission denied。这些是细节

操作系统:Windows 10

Dockerfile

FROM python:3.9.13-alpine3.16
LABEL maintainer=""

ENV PYTHONUNBUFFERED 1

COPY ./requirements.txt /requirements.txt
COPY ./app /app
COPY ./scripts /scripts

WORKDIR /app
EXPOSE 8000

RUN python -m venv /py && \
  /py/bin/pip install --upgrade pip && \
  apk add --update --no-cache postgresql-client && \
  apk add --update --no-cache --virtual .tmp-deps \
      build-base postgresql-dev musl-dev linux-headers && \
  /py/bin/pip install -r /requirements.txt && \
  apk del .tmp-deps && \
  adduser --disabled-password --no-create-home app && \
  mkdir -p /vol/web/static && \
  mkdir -p /vol/web/media && \
  chown -R app:app /vol && \    
  chmod -R 755 /vol && \
  chmod -R +x /scripts

ENV PATH="/scripts:/py/bin:$PATH"

USER app

CMD ["run.sh"]

这是我的docker-compose.yml 文件

version: "3.9"

services:
  app:
    build:
      context: .
    restart: always
    volumes:
      - static-data:/vol/web
    environment:
      - DB_HOST=db
      - DB_NAME=${DB_NAME}
      - DB_USER=${DB_USER}
      - DB_PASS=${DB_PASS}
      - SECRET_KEY=${SECRET_KEY}
      - ALLOWED_HOSTS=${ALLOWED_HOSTS}
    depends_on:
      - db

  db:
    image: postgres:13-alpine
    restart: always
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASS}

  proxy:
    build:
      context: ./proxy
    restart: always
    depends_on:
      - app
    ports:
      - 80:8000
    volumes:
      - static-data:/vol/static

volumes:
  postgres-data:
  static-data:

这是错误的堆栈跟踪

app_1    | Traceback (most recent call last):
app_1    |   File "/app/manage.py", line 22, in <module>
app_1    |     main()
app_1    |   File "/app/manage.py", line 18, in main
app_1    |     execute_from_command_line(sys.argv)
app_1    |   File "/py/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
app_1    |     utility.execute()
app_1    |   File "/py/lib/python3.9/site-packages/django/core/management/__init__.py", line 413, in execute
app_1    |     self.fetch_command(subcommand).run_from_argv(self.argv)
app_1    |   File "/py/lib/python3.9/site-packages/django/core/management/base.py", line 354, in run_from_argv
app_1    |     self.execute(*args, **cmd_options)
app_1    |   File "/py/lib/python3.9/site-packages/django/core/management/base.py", line 398, in execute
app_1    |     output = self.handle(*args, **options)
app_1    |   File "/py/lib/python3.9/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 187, in handle
app_1    |     collected = self.collect()
app_1    |   File "/py/lib/python3.9/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 114, in collect
app_1    |     handler(path, prefixed_path, storage)
app_1    |   File "/py/lib/python3.9/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 348, in copy_file
app_1    |     self.storage.save(prefixed_path, source_file)
app_1    |   File "/py/lib/python3.9/site-packages/django/core/files/storage.py", line 54, in save
app_1    |     name = self._save(name, content)
app_1    |   File "/py/lib/python3.9/site-packages/django/core/files/storage.py", line 260, in _save
app_1    |     os.makedirs(directory, exist_ok=True)
app_1    |   File "/usr/local/lib/python3.9/os.py", line 215, in makedirs
app_1    |     makedirs(head, exist_ok=exist_ok)
app_1    |   File "/usr/local/lib/python3.9/os.py", line 215, in makedirs
app_1    |     makedirs(head, exist_ok=exist_ok)
app_1    |   File "/usr/local/lib/python3.9/os.py", line 215, in makedirs
app_1    |     makedirs(head, exist_ok=exist_ok)
app_1    |   [Previous line repeated 1 more time]
app_1    |   File "/usr/local/lib/python3.9/os.py", line 225, in makedirs
app_1    |     mkdir(name, mode)
app_1    | PermissionError: [Errno 13] Permission denied: '/app/vol'

在我的Dockerfile 中,我特别为 /vol 的用户应用程序授予了权限。我错过了什么?我该如何解决这个问题?

【问题讨论】:

标签: django docker docker-compose dockerfile


【解决方案1】:

尝试这个

RUN python -m venv /py && 
    /py/bin/pip install --upgrade pip && 
    apk add --update --no-cache postgresql-client && 
    apk add --update --no-cache --virtual .tmp-deps 
        build-base postgresql-dev musl-dev linux-headers && 
    /py/bin/pip install -r /requirements.txt && 
    apk del .tmp-deps && 
    adduser --disabled-password --no-create-home app && 
    mkdir -p /vol/web/static && 
    mkdir -p /vol/web/media && 
    chown -R app:app /app &&               **This has been added**
    chown -R app:app /vol && 
    chmod -R 755 /vol && 
    chmod -R +x /scripts

ENV PATH="/scripts:/py/bin:$PATH"       

USER app

CMD ["run.sh"]

【讨论】:

    【解决方案2】:

    尝试像这样组织您的 Dockerfile:

    FROM python:3.9.13-alpine3.16
    LABEL maintainer="sohail.developes@gmail.com"
    
    ENV PYTHONUNBUFFERED 1
    
    # Create work user
    RUN set -x ; 
        addgroup -g 83 -S app ; 
        adduser -u 83 -D -S -G app app && exit 0 ; exit 1 
    
    COPY --chown=app:app ./requirements.txt /requirements.txt
    COPY --chown=app:app ./app /app
    COPY --chown=app:app ./scripts /scripts
    
    WORKDIR /app
    EXPOSE 8000
    
    RUN python -m venv /py && 
      /py/bin/pip install --upgrade pip && 
      apk add --update --no-cache postgresql-client && 
      apk add --update --no-cache --virtual .tmp-deps 
          build-base postgresql-dev musl-dev linux-headers && 
      /py/bin/pip install -r /requirements.txt && 
      apk del .tmp-deps && 
      adduser --disabled-password --no-create-home app && 
      mkdir -p /vol/web/static && 
      mkdir -p /vol/web/media && 
      chown -R app:app /vol &&     
      chmod -R 755 /vol && 
      chmod -R +x /scripts
    
    ENV PATH="/scripts:/py/bin:$PATH"
    
    USER app
    
    CMD ["run.sh"]
    

    首先,您需要在映像中创建一个用户应用程序,并使用 --chown 选项将文件从主机复制到容器。我还建议您将 Python 包的安装与程序的安装分开。

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2021-08-07
      • 2020-10-27
      • 2021-08-09
      相关资源
      最近更新 更多