Докеризация приложения Django + mySql: (2002, "Не удается подключиться к локальному серверу MySQL через сокет '/run/mysqld/mysqld.sock' (2)") ошибка
Я пытаюсь докеризировать мое приложение Django, которое использует mySql, но сталкиваюсь с некоторыми проблемами. Это первый раз, когда я использую Docker, поэтому, возможно, есть что-то базовое, чего я не понимаю.
Следуя некоторым онлайн-учебникам, вот мой Dockerfile:
FROM python:3.8
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN pip install --upgrade pip && pip install -r requirements.txt
RUN pip install mysqlclient
COPY . /code/
А это мой docker-compose:
version: '3'
services:
db:
image: mysql:8
ports:
- '3306:3306'
environment:
MYSQL_DATABASE: 'database_name'
MYSQL_USER: 'django'
MYSQL_PASSWORD: 'django-password'
MYSQL_ROOT_PASSWORD: 'password'
volumes:
- .setup.sql:/docker-entrypoint-initbd.d/setup.sql
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
links:
- db
settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ.get('MYSQL_DATABASE', 'mysql-db'),
'USER': os.environ.get('MYSQL_USER', 'mysql-user'),
'PASSWORD': os.environ.get('MYSQL_PASSWORD', 'mysql-password'),
'HOST': os.environ.get('MYSQL_DATABASE_HOST', 'db'),
'PORT': os.environ.get('MYSQL_DATABASE_PORT', 3306),
}
}
И .env:
MYSQL_DATABASE=database_name
MYSQL_USER=django
MYSQL_PASSWORD=django-password
MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE_HOST=db
MYSQL_DATABASE_PORT=3306
Для докеризации приложения я использую Docker desktop в Windows 10.
После того как я выполнил:
docker-compose up -d
Я вижу, что оба контейнера (db и web) запущены, однако в web контейнере я вижу, что django не может подключиться к mySql, так как выдает ошибку:
django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)")
Я просмотрел несколько похожих тем, но они не помогли мне понять, в чем проблема, и как ее решить. Пожалуйста, помогите мне пролить свет на эту проблему, спасибо!
Пробовали ли вы сначала запустить свой контейнер db?
docker compose up db
docker compose build web
docker compose up
После создания сервисов вы сможете docker compose up
не запускать сначала db-контейнер, поскольку контейнеры будут запускаться в порядке depends_on
определенном в файле docker-compose.