Docker Compose - Поле ImageField в Django не может загружать изображения, когда я переношу базу данных с sqlite3 на MySQL в Docker Compose
У меня есть модель Article
в приложении Django blog
Файл /backend/blog/models.py
class Article(models.Model):
class Status(models.TextChoices):
DRAFT = 'DF', 'Draft'
PUBLISHED = 'PB', 'Published'
title = models.CharField(max_length=255)
slug = models.SlugField(max_length=100, blank=True, unique=True)
content = MDTextField(null=True, blank=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
comments = models.IntegerField(default=0)
reactions = models.IntegerField(default=0)
updated = models.DateTimeField(auto_now=True)
category = models.ForeignKey(Category, related_name='articles', on_delete=models.SET_NULL, null=True)
tags = models.ManyToManyField(Tag)
image_background = models.ImageField(upload_to='articles_images/', blank=True, null=True)
image_url = models.URLField(max_length=500, blank=True, null=True) # Updated field to store image URL from Firebase
intro = models.TextField()
estimate_time = models.CharField(max_length=50)
type = models.ForeignKey(Type, on_delete=models.SET_NULL, null=True)
publish = models.DateTimeField(default=timezone.now)
status = models.CharField(max_length=2,
choices=Status.choices,
default=Status.DRAFT)
Далее я переношу базу данных по умолчанию SQLITE3 на MYSQL для проекта Django
Файл /backend/settings.py
# ! Config database for mysql
DATABASES = {
"default": {
"ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"),
"NAME": os.environ.get("SQL_DATABASE", os.path.join(BASE_DIR, 'db.sqlite3')),
"USER": os.environ.get("SQL_USER", "myuser"),
"PASSWORD": os.environ.get("SQL_PASSWORD", "myuserpassword"),
"HOST": os.environ.get("SQL_HOST", "localhost"),
"PORT": os.environ.get("SQL_PORT", "3306"),
'OPTIONS': {
'charset': 'utf8mb4',
}
}
}
Я также настроил путь media для загрузки изображения /backend/settings.py
STATIC_URL = 'static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATICFILES_DIRS = (os.path.join(BASE_DIR,"static"), )
Я использовал docker-compose.yml
для создания образа и запуска контейнера для backend (django), frontend (nextjs) и базы данных (mysql) для разработки моего проекта
version: '3.8'
services:
database:
image: mysql:9.1.0
container_name: mysql-container
volumes:
# mysql_data: data stogare managed by Docker: /var/lib/docker/volumes/
# See info: docker volume inspect mysql_data
# /var/lib/mysql: is the default path in container MySQL
- mysql_data:/var/lib/mysql
restart: always
env_file:
- .env
environment:
- MYSQL_ROOT_PASSWORD=${SQL_ROOT_PASSWORD}
- MYSQL_USER=${SQL_USER}
- MYSQL_PASSWORD=${SQL_PASSWORD}
- MYSQL_DATABASE=${SQL_DATABASE}
- MYSQL_TCP_PORT=${MYSQL_TCP_PORT}
ports:
- "3306:3306"
networks:
- default
backend:
build:
dockerfile: Dockerfile
context: ./backend # Find location the Dockerfile of backend in the `backend` directory.
image: django
container_name: django-container
restart: always
env_file:
- .env
volumes:
# - <path_in_host>:<path_in_container>
- ./backend:/app # Mount all contents of folder backend into container
- ./backend/media:/app/media
ports:
- "3001:3001"
command: python manage.py runserver 0.0.0.0:3001
depends_on:
- database
networks:
- default
frontend:
build:
dockerfile: Dockerfile
context: ./frontend
image: nextjs
container_name: nextjs-container
restart: always
volumes:
- ./frontend:/app
- /app/node_modules
ports:
- "3000:3000"
command: sh -c "export PATH=$$PATH:/app/node_modules/.bin && npm run dev"
depends_on:
- backend
networks:
- default
networks:
default:
driver: bridge
volumes:
mysql_data:
Однако я не могу загрузить ни одного изображения из
image_background = models.ImageField(upload_to='articles_images/', blank=True, null=True)
несмотря на то, что до этого все работало отлично с SQLITE3. Я проверил разрешения на доступ к каталогу /media
в контейнере, и все каталоги имеют разрешения на чтение, запись и выполнение.
Пожалуйста, помогите мне решить эту проблему. Большое спасибо
<
Это все мои /backend/blog/models.py
Я попробовал отладить разрешение моей папки /app/media