Python 运行docker compose时,我收到一个权限错误
我是使用docker部署的新手,所以我相信我在这里遗漏了一些重要的东西。我正在尝试使用docker/nginx启动我的应用程序,我已经到了可以将开发环境作为容器运行的阶段,但是当我运行将用于部署的yml时,我得到了一个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
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
我没有它,就我所知,我发现changinSTATIC\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的错误日志文件以进行更多调查