【问题标题】:Permission denied with django migrations in dockerdocker中的django迁移权限被拒绝
【发布时间】:2019-09-29 17:39:54
【问题描述】:

我正在使用 docker compose 和 django - postgres - rabbitmq

一切顺利,即使 django 容器已启动并运行到我想要 makemigrations 它与 django-celery-beat 一起停止的地步

Migrations for 'django_celery_beat':
django_1        |   /usr/local/lib/python2.7/site-packages/django_celery_beat/migrations/0005_auto_20190512_1531.py
django_1        |     - Alter field event on solarschedule
django_1        | Traceback (most recent call last):
django_1        |   File "/app/manage.py", line 10, in <module>
django_1        |     execute_from_command_line(sys.argv)
django_1        |   File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
django_1        |     utility.execute()
django_1        |   File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 356, in execute
django_1        |     self.fetch_command(subcommand).run_from_argv(self.argv)
django_1        |   File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
django_1        |     self.execute(*args, **cmd_options)
django_1        |   File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute
django_1        |     output = self.handle(*args, **options)
django_1        |   File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 193, in handle
django_1        |     self.write_migration_files(changes)
django_1        |   File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 232, in write_migration_files
django_1        |     with io.open(writer.path, "w", encoding='utf-8') as fh:
django_1        | IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/site-packages/django_celery_beat/migrations/0005_auto_20190512_1531.py

虽然用户模型在迁移时被记录下来,并且它应该从 django 本身的AbstractUser 继承,但那里没有引发权限错误

django_1        | Migrations for 'users':
django_1        |   users/migrations/0001_initial.py
django_1        |     - Create model UserAccount
django_1        |     - Create model Branch
django_1        |     - Create model Organization
django_1        |     - Add field organization to branch
django_1        |     - Add field bills_groups to useraccount
django_1        |     - Add field branch to useraccount
django_1        |     - Add field groups to useraccount
django_1        |     - Add field user_permissions to useraccount

所以我尝试将 sudo 用户添加到 python-2.7 alpine 但实际上我未能以 sudo 权限运行此命令

那么我应该怎么做,我应该在 docker 中使用virtualenv 运行图像还是有任何调整来修复这个

Dockerfile

FROM python:2.7-alpine

ENV PYTHONUNBUFFERED 1
RUN addgroup -S django \
    && adduser -S -G django django

RUN apk update \
  && apk add sudo \
  # psycopg2 dependencies
  && apk add --virtual build-deps gcc python-dev musl-dev \
  && apk add postgresql-dev \
  # CFFI dependencies
  && apk add libffi-dev py-cffi \
  # Translations dependencies
  && apk add gettext \
  # https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell
  && apk add postgresql-client

# Requirements are installed here to ensure they will be cached.
COPY ./requirements.txt /requirements.txt
RUN pip install --no-cache-dir --default-timeout=100 -r /requirements.txt \
        && rm -rf /requirements

COPY ./compose/testing/django/entrypoint /entrypoint
RUN sed -i 's/\r//' /entrypoint
RUN chmod +x /entrypoint
RUN chown django /entrypoint

COPY ./compose/testing/django/start /start
RUN sed -i 's/\r//' /start
RUN chmod +x /start
RUN chown django /start

COPY . /app

RUN chown -R django /app

USER django

WORKDIR /app

ENTRYPOINT ["/entrypoint"]

docker-compose.yml

version: '3'

volumes:
  production_postgres_data: {}
  production_postgres_data_backups: {}

services:
  django: &django
    build:
      context: .
      dockerfile: ./compose/testing/django/Dockerfile
    image: panel_testing_django
    depends_on:
      - postgres
      - rabbitmq
    env_file:
      - ./.envs/.production/.django
      - ./.envs/.production/.postgres
    command: /start
    ports:
      - "8000"
    expose:
      - "8000"

  postgres:
    build:
      context: .
      dockerfile: ./compose/staging/postgres/Dockerfile
    image: panel_testing_postgres
    env_file:
      - ./.envs/.production/.postgres
    volumes:
      - production_postgres_data:/var/lib/postgresql/data
      - production_postgres_data_backups:/backups
    ports:
     - "5432"

  rabbitmq:
    hostname: rabbit
    image: rabbitmq:3-management
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=mypass
    ports:
      - "5672:5672"  
      - "15672:15672"

  celeryworker:
    <<: *django
    image: panel_testing_celeryworker
    command: /start-celeryworker

  celerybeat:
    <<: *django
    image: panel_testing_celerybeat
    command: /start-celerybeat

  flower:
    <<: *django
    image: panel_testing_flower
    ports:
      - "5555:5555"
    command: /start-flower

【问题讨论】:

  • 您可以添加您的Dockerfiledocker-compose 文件吗?
  • 我做了,检查一下
  • 我在下面添加了一个答案,试试吧:)希望它能解决问题:)
  • 它正在尝试写入/usr/local/lib 中可能由 root 拥有的文件,但随后 Dockerfile 切换到 django 用户,因此它不再有权写入该文件。为什么这些迁移文件存储在/usr/local/lib 中?这些应该是你有写权限的地方,比如/app 文件夹。

标签: python django docker celerybeat


【解决方案1】:

今天有更多相同的问题。我使用 docker 创建了一个项目,当第一次尝试运行 makemigrations 时,得到了这个错误:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.7/site-packages/django/contrib/admin/migrations/0004_auto_20190515_1649.py'

我通过运行 makemigrations 来解决它,指定应用程序名称(核心是应用程序名称),如下所示:

docker-compose run web_app sh -c "python manage.py makemigrations core"

【讨论】:

    【解决方案2】:

    我在 Linux 上,就我而言,这只是转到存储迁移的文件夹并为文件夹本身提供足够权限的情况。

    例如:

    chmod . 666
    

    【讨论】:

      【解决方案3】:

      我刚刚在 docker 中使用了 virtualenv,并将对环境的所有权授予我的用户site-packages dir

      RUN pip install virtualenv && virtualenv -p python /app/venv
      RUN /app/venv/bin/pip install -r req.txt
      RUN /app/venv/bin/python /app/code/manage.py makemigrations
      

      完成

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2020-08-31
        • 2021-11-05
        • 1970-01-01
        • 2022-01-18
        • 2021-04-12
        • 2022-01-03
        相关资源
        最近更新 更多