Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行docker compose时,我收到一个权限错误_Python_Django_Docker_Nginx_Containers - Fatal编程技术网

Python 运行docker compose时,我收到一个权限错误

Python 运行docker compose时,我收到一个权限错误,python,django,docker,nginx,containers,Python,Django,Docker,Nginx,Containers,我是使用docker部署的新手,所以我相信我在这里遗漏了一些重要的东西。我正在尝试使用docker/nginx启动我的应用程序,我已经到了可以将开发环境作为容器运行的阶段,但是当我运行将用于部署的yml时,我得到了一个PermissionError:[Errno 13]权限被拒绝:“app/vol”错误。也就是说,我可以运行docker compose-f docker-compose.yml up--build,这样我就可以在开发环境中访问我的应用程序,但是运行docker compose-f

我是使用docker部署的新手,所以我相信我在这里遗漏了一些重要的东西。我正在尝试使用docker/nginx启动我的应用程序,我已经到了可以将开发环境作为容器运行的阶段,但是当我运行将用于部署的yml时,我得到了一个
PermissionError:[Errno 13]权限被拒绝:“app/vol”
错误。也就是说,我可以运行
docker compose-f docker-compose.yml up--build
,这样我就可以在开发环境中访问我的应用程序,但是运行
docker compose-f docker-compose-deploy.yml up--build
会导致显示的错误消息

这是根据在线教程编写的,但是在Django项目中添加了额外的依赖项和内容。我已经制作了一个与本教程相同的版本,并且可以正常工作,当我检查我的版本时,似乎没有什么不同

任何帮助都将不胜感激

终端错误输出:

proxy_1                          | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
proxy_1                          | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
proxy_1                          | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
proxy_1                          | 10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
proxy_1                          | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
proxy_1                          | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
proxy_1                          | /docker-entrypoint.sh: Configuration complete; ready for start up
proxy_1                          | 2021/06/10 17:23:34 [emerg] 1#1: invalid host in upstream "app:8000/" in /etc/nginx/conf.d/default.conf:9
proxy_1                          | nginx: [emerg] invalid host in upstream "app:8000/" in /etc/nginx/conf.d/default.conf:9
app_1  | Traceback (most recent call last):
app_1  |   File "manage.py", line 23, in <module>
app_1  |     main()
app_1  |   File "manage.py", line 19, in main
app_1  |     execute_from_command_line(sys.argv)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
app_1  |     utility.execute()
app_1  |   File "/usr/local/lib/python3.8/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 "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
app_1  |     self.execute(*args, **cmd_options)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
app_1  |     output = self.handle(*args, **options)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 187, in handle
app_1  |     collected = self.collect()
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 114, in collect
app_1  |     handler(path, prefixed_path, storage)
app_1  |   File "/usr/local/lib/python3.8/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 "/usr/local/lib/python3.8/site-packages/django/core/files/storage.py", line 54, in save
app_1  |     return self._save(name, content)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/files/storage.py", line 255, in _save
app_1  |     os.makedirs(directory, exist_ok=True)
app_1  |   File "/usr/local/lib/python3.8/os.py", line 213, in makedirs
app_1  |     makedirs(head, exist_ok=exist_ok)
app_1  |   File "/usr/local/lib/python3.8/os.py", line 213, in makedirs
app_1  |     makedirs(head, exist_ok=exist_ok)
app_1  |   File "/usr/local/lib/python3.8/os.py", line 213, 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.8/os.py", line 223, in makedirs
app_1  |     mkdir(name, mode)
app_1  | PermissionError: [Errno 13] Permission denied: '/app/vol'

proxy/default.conf:

server {
    listen 8080;

    location /static {
        alias /vol/static;
    }

    location / {
        uwsgi_pass app:8000/;
        include /etc/nginx/uwsgi_params;
    }
}
代理/Dockerfile:

FROM nginxinc/nginx-unprivileged:1-alpine

COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./uwsgi_params /etc/nginx/uwsgi_params

USER root

RUN mkdir -p /vol/static
RUN chmod 755 /vol/static

USER nginx
FROM python:3.8-alpine

ENV PATH="/scripts:${PATH}"

COPY ./requierments.txt /requierments.txt 
RUN apk add --update --no-cache --virtual .tmp libc-dev jpeg-dev zlib-dev gcc linux-headers

RUN pip install -r /requierments.txt
RUN apk del .tmp

RUN mkdir /syntiant_filesystem_companion
COPY ./syntiant_filesystem_companion /syntiant_filesystem_companion
WORKDIR /syntiant_filesystem_companion
COPY ./scripts /scripts

RUN chmod +x /scripts/*

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static

RUN adduser -D user
RUN chown -R user:user /vol
RUN chmod -R 755 /vol/web
USER user

CMD ["entrypoint.sh"]
docker-compose.yml:

version: '3.7'

services: 
    app:
        build: 
            context: .
        ports: 
            - "8000:8000"
        volumes: 
            - ./app:/app
        command: sh -c "python manage.py runserver 0.0.0.0:8000"
        environment: 
            - DEBUG=1
docker-compose-deploy.yml:

version: '3.7'

services: 
    app:
        build: 
            context: .
        volumes: 
            - /static_data:/vol/web
        environment: 
            - SECRET_KEY=samplesecret123
            - ALLOWED_HOSTS=127.0.0.1,localhost
    proxy:
        build:
            context: ./proxy
        volumes: 
            - /static_data:/vol/static
        ports: 
            - "8080:8080"
        depends_on: 
            - app

volumes: 
    static_data:
Dockerfile:

FROM nginxinc/nginx-unprivileged:1-alpine

COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./uwsgi_params /etc/nginx/uwsgi_params

USER root

RUN mkdir -p /vol/static
RUN chmod 755 /vol/static

USER nginx
FROM python:3.8-alpine

ENV PATH="/scripts:${PATH}"

COPY ./requierments.txt /requierments.txt 
RUN apk add --update --no-cache --virtual .tmp libc-dev jpeg-dev zlib-dev gcc linux-headers

RUN pip install -r /requierments.txt
RUN apk del .tmp

RUN mkdir /syntiant_filesystem_companion
COPY ./syntiant_filesystem_companion /syntiant_filesystem_companion
WORKDIR /syntiant_filesystem_companion
COPY ./scripts /scripts

RUN chmod +x /scripts/*

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static

RUN adduser -D user
RUN chown -R user:user /vol
RUN chmod -R 755 /vol/web
USER user

CMD ["entrypoint.sh"]
Django settings.py:

from pathlib import Path
import os, sys

# Build paths inside the project like this: BASE_DIR / 'subdir'.
#BASE_DIR = Path(__file__).resolve().parent.parent
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#STATICFILES_DIRS = (
#  os.path.join(BASE_DIR, 'static/'),
#)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY', 'changeme')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = bool(int(os.environ.get('DEBUG',0)))

ALLOWED_HOSTS = []
ALLOWED_HOSTS_ENV = os.environ.get('ALLOWED_HOSTS')
if ALLOWED_HOSTS_ENV:
    ALLOWED_HOSTS.extend(ALLOWED_HOSTS_ENV.split(','))


AUTH_USER_MODEL = "register.Account"


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crispy_forms',
    'main.apps.MainConfig',
    'register.apps.RegisterConfig',

]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'app.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'app.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/static/'
MEDIA_URL='/static/media/'

STATIC_ROOT='vol/web/static'
MEDIA_ROOT='vol/web/media'

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

CRISPY_TEMPLATE_PACK="bootstrap4"

LOGIN_REDIRECT_URL='/'

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(os.path.join(PROJECT_ROOT, 'django_project_name'))


我对django/docker很陌生,所以我肯定我遗漏了一些样板资料。了解此问题的根本原因方面的任何帮助都将非常有用,因为据我所知,我尝试做的事情非常简单。

您应该使用sudoer用户,并以sudo用户的身份运行代码 这是操作系统的问题,它不允许您的yml启动, 如果不可能,则应在运行代码所需的计算机/容器上使用chmod+x(文件名)更改代码访问/执行级别。
有时它会工作

我将在没有sudo访问权限的终端上运行此程序,因此我希望尽可能避免使用sudo。然后在机器上使用chmod+x(您的文件名),并在/etc/nginx/conf.d/default.conf:9中的上游“app:8000/”中重新运行,因为您的错误是
nginx:[emerg]无效主机,您的
nginx
中是否定义了名为
app
的网站?在哪里定义?我在
default.conf
中有
app:8000
,但除了它或
docker compose deploy.yml
我没有它,就我所知,我发现changin
STATIC\u ROOT='vol/web/STATIC'
MEDIA\u ROOT='vol/web/MEDIA'
STATIC\u ROOT='vol/web/STATIC'
MEDIA\u ROOT='/vol/web/MEDIA'
允许完成构建并启动Worker。然而,我从控制台得到了一个500错误,没有其他什么。我可以看到,
0个静态文件从相关控制台复制到'/vol/web/static',131未经修改
。有没有想过是什么原因导致了这种情况和/或这是否是正确的方法?因为您的文件以前被复制过,我认为
0静态文件…
是一条正常的消息。我在
python:3.8-alpine
图像中没有看到任何错误日志文件,但如果它们存储在
代理
容器中,请执行到该容器中,并查看nginx的错误日志文件以进行更多调查