【问题标题】:Django on Docker: How to access a file from views.pyDocker 上的 Django:如何从 views.py 访问文件
【发布时间】:2026-01-20 09:15:01
【问题描述】:

我一直在 docker 环境下开发一个 web 应用程序。这样一来,容器中views.py访问其他文件的方法就失败了。以下是名为“web”的容器运行时的日志

而且,demo/demo_app_views.py 是

class TestViews(TemplateView):
    template_name='top.html'

    with open('usr/src/demo/data/a', 'rb') as data:
        b = pickle.load(data)
    elder_brother=b['1']

    def get_context_data(self, **kwargs):
        context=super().get_context_data(**kwargs)
        context['brother']=elder_brother
        return context
top=TestViews.as_view()

当然,我确认了“web”容器中“data”文件夹中存储的文件“a”

而 Dockerfile 是

FROM python:3.7-alpine

WORKDIR /usr/src/demo
RUN mkdir /usr/src/demo/staticfiles

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update \ && apk add postgresql-dev gcc python3-dev musl-dev

RUN pip install --upgrade pip
COPY ./requirements.txt . 
RUN pip install -r requirements.txt

COPY ./entrypoint.sh .

COPY . . 

ENTRYPOINT ["/usr/src/demo/entrypoint.sh"]

和... Docker-compose.yml 是

version: '3.7'

services:
   web:
    build: ./demo
    command: gunicorn  demo.wsgi:application --bind 0.0.0.0:8000
    volumes: 
      - ./demo/:/usr/src/demo:cached
      - static_volume:/usr/src/demo/staticfiles
    expose:
      - 8000
    env_file:
      - ./base.env
    depends_on:
        - db
    
  db:
    image: postgres:11.4-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=project_demo
      - POSTGRES_PASSWORD=project_demo
      - POSTGRES_DB=project_demo_dev
  
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/demo/staticfiles
   ports:
      - 1337:80
   depends_on:
      - web

volumes:
   postgres_data:
  static_volume:

以及docker-compose up -d --build之后的移位日志

web_1    |     res = instance.__dict__[self.name] =     self.func(instance)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/urls/resolvers.py", line 564, in urlconf_module
web_1    |     return import_module(self.urlconf_name)
web_1    |   File "/usr/local/lib/python3.7/importlib/__init__.py",   line 127, in import_module
web_1    |     return _bootstrap._gcd_import(name[level:], package, level)
web_1    |   File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
web_1    |   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
web_1    |   File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
web_1    |   File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
web_1    |   File "<frozen importlib._bootstrap_external>", line 728, in exec_module
web_1    |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
web_1    |   File "/usr/src/demo/demo/urls.py", line 21, in <module>
web_1    |     path('demo_app/', include('demo_app.urls')),
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/urls/conf.py", line 34, in include
web_1    |     urlconf_module = import_module(urlconf_module)
web_1    |   File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
web_1    |     return _bootstrap._gcd_import(name[level:], package, level)
web_1    |   File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
web_1    |   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
web_1    |   File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
web_1    |   File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
web_1    |   File "<frozen importlib._bootstrap_external>", line 728, in exec_module
web_1    |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
web_1    |   File "/usr/src/demo/demo_app/urls.py", line 18, in  <module>
web_1    |     from . import views
web_1    |   File "/usr/src/demo/demo_app/views.py", line 27, in <module>
web_1    |     class TestViews(TemplateView):
web_1    |   File "/usr/src/demo/demo_app/views.py", line 30, in TestViews
web_1    |     with open('usr/src/demo/data/a', 'rb') as data:
web_1    | FileNotFoundError: [Errno 2] No such file or directory: 'usr/src/demo/data/a'
web_1    | Traceback (most recent call last):
web_1    |   File "manage.py", line 21, in <module>
web_1    |     main()
web_1    |   File "manage.py", line 17, in main
web_1    |     execute_from_command_line(sys.argv)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
web_1    |     utility.execute()
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
web_1    |     self.fetch_command(subcommand).run_from_argv(self.argv)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
web_1    |     self.execute(*args, **cmd_options)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 361, in execute
web_1    |     self.check()
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 390, in check
web_1    |     include_deployment_checks=include_deployment_checks,
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 65, in _run_checks
web_1    |     issues.extend(super()._run_checks(**kwargs))
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 377, in _run_checks
web_1    |     return checks.run_checks(**kwargs)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/checks/registry.py", line 72, in run_checks
web_1    |     new_errors = check(app_configs=app_configs)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/checks/urls.py", line 13, in check_url_config
web_1    |     return check_resolver(resolver)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/core/checks/urls.py", line 23, in check_resolver
web_1    |     return check_method()
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/urls/resolvers.py", line 398, in check
web_1    |     for pattern in self.url_patterns:
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/utils/functional.py", line 80, in __get__
web_1    |     res = instance.__dict__[self.name] = self.func(instance)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/urls/resolvers.py", line 571, in url_patterns
web_1    |     patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/utils/functional.py", line 80, in __get__
web_1    |     res = instance.__dict__[self.name] = self.func(instance)
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/urls/resolvers.py", line 564, in urlconf_module
web_1    |     return import_module(self.urlconf_name)
web_1    |   File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
web_1    |     return _bootstrap._gcd_import(name[level:], package, level)
web_1    |   File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
web_1    |   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
web_1    |   File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
web_1    |   File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
web_1    |   File "<frozen importlib._bootstrap_external>", line 728, in exec_module
web_1    |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
web_1    |   File "/usr/src/demo/demo/urls.py", line 21, in <module>
web_1    |     path('demo_app/', include('demo_app.urls')),
web_1    |   File "/usr/local/lib/python3.7/site-packages/django/urls/conf.py", line 34, in include
web_1    |     urlconf_module = import_module(urlconf_module)
web_1    |   File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
web_1    |     return _bootstrap._gcd_import(name[level:], package, level)
web_1    |   File "<frozen importlib._bootstrap>", line 1006, in _gcd_import 
web_1    |   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
web_1    |   File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
web_1    |   File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
web_1    |   File "<frozen importlib._bootstrap_external>", line 728, in exec_module
web_1    |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
web_1    |   File "/usr/src/demo/demo_app/urls.py", line 18, in <module>
web_1    |     from . import views
web_1    |   File "/usr/src/demo/demo_app/views.py", line 27, in <module>
web_1    |     class TestViews(TemplateView):
web_1    |   File "/usr/src/demo/demo_app/views.py", line 30, in TestViews
web_1    |     with open('usr/src/demo/data/a', 'rb') as data:
web_1    | FileNotFoundError: [Errno 2] No such file or directory: 'usr/src/demo/data/a'
web_1    | [2020-07-04 07:52:18 +0000] [1] [INFO] Starting gunicorn 20.0.4
web_1    | [2020-07-04 07:52:18 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
web_1    | [2020-07-04 07:52:18 +0000] [1] [INFO] Using worker: sync
web_1    | [2020-07-04 07:52:18 +0000] [10] [INFO] Booting worker with pid: 10

我不擅长docker,所以请告诉我如何访问文件'a',它是字典类型的文件,而不是数据库

谢谢

【问题讨论】:

  • 您能否提供一个minimal reproducible example 来展示您如何构建和运行您的容器?您能否将这些日志和错误消息作为文本而不是终端窗口的屏幕截图提供?
  • 对不起,我添加了最少的代码和日志(可以吗?)。我希望你能提供明智的答案。
  • open('usr/src/demo...') 没有前导斜杠会将其解释为相对于当前目录,这可能不是您的意思。这在没有 Docker 的普通 Python 虚拟环境中是否有效?
  • 感谢大卫。你说的很对,能解决困扰我几天的问题。所以我会发布答案。

标签: django docker view


【解决方案1】:

大卫明智的评论导致了答案,它是改变

open('usr/src/demo...')

open('/usr/src/demo...')

感谢大卫

【讨论】: