Почему загрузка изображений не работает в Django при использовании docker
У меня есть ImageField в приложении Django blog, которое загружает изображения в определенную папку. Настройка отлично работает, когда я запускаю приложение с помощью python manage.py runserver
; изображение загружается в нужную папку без каких-либо проблем.
Однако, когда я запускаю приложение в Docker с помощью docker-compose
, образ не загружается. Журналы Docker (docker logs <container-name>
) не показывают никаких ошибок.
Вот соответствующая часть моей установки:
Я использую /Works/app-media
в качестве целевой папки для загружаемых изображений. Я также проверил, что эта папка смонтирована правильно. Я проверил это, создав файл внутри контейнера по адресу /app/media, и он правильно отразился в локальной папке.
Вот моя конфигурация docker-compose.yml для справки:
services:
admin-backend-service:
build:
context: .
container_name: admin-backend
ports:
- "8000:8000"
volumes:
- ./static:/app/static
- /Works/app-media:/app/media
environment:
DEBUG: "0"
ALLOWED_HOSTS: "admin.dypzen.com"
restart: always
Я использую .env файл для загрузки MEDIA_URL и MEDIA_ROOT в мой settings.py
и я проверил, правильно ли загружаются эти переменные
MEDIA_ROOT = os.getenv('MEDIA_ROOT', os.path.join(BASE_DIR, 'media'))
MEDIA_URL = os.getenv('MEDIA_URL', '/media/')
Для наглядности я привожу часть моего файла models.py, чтобы увидеть, как я определил ImageField для моего приложения для записи блога
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
subtitle = models.CharField(max_length=200, blank=True)
content = models.TextField()
image = models.ImageField(upload_to='blog_images', blank=True, null=True)
video = models.FileField(upload_to='blog_videos', blank=True, null=True)
Django делает не обслуживать медиа/статические файлы в production [Django-doc] (с DEBUG = False
). Действительно, способ Django обслуживать статические/медийные файлы при разработке (DEBUG = True
) неэффективен и, вероятно, содержит уязвимости в безопасности.
Обычно такие файлы обслуживаются веб-сервером, например nginx или Apache, или используются облачные сервисы, например ведро Amazon S3. Это позволяет эффективно кэшировать, транслировать большие медиафайлы и делать контент глобально доступным через сеть доставки контента (CDN).
You thus will have to set up an webserver like nginx in your docker that serves static and media files, and forwards requests to the Django backend. Typically this webserver is also used to implement HTTPS such that Django servers the underlying HTTP requests. You can find details how to configure the webserver in the Django documentation [Django-doc].