Docker Django mysql
Вот структура папок:
📄 Dockerfile
📄 .env
📄 requirements.txt
📁 pr/
📁 static/
📄 app.js
📄 manage.py
📁 pr/
📄 wsgi.py
📄 __init__.py
📄 urls.py
📄 settings.py
📄 asgi.py
📄 docker-compose.yml
Здесь содержимое важного файла
Dockerfile
---------
# Use an official Python runtime as a parent image
# syntax=docker/dockerfile:1
FROM python:3.11
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Install system dependencies
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
gcc \
libmariadb-dev \
&& rm -rf /var/lib/apt/lists/*
# Upgrade pip
RUN pip install --upgrade pip
# Set the working directory
WORKDIR /app
# Install Python dependencies
COPY requirements.txt /app/
RUN pip install -r requirements.txt
# Copy the project code into the container
COPY ./pr /app/
# Expose the Django development server port
EXPOSE 8000
requirements.txt
---------
psycopg2>=2.8
asgiref==3.8.1
Django==5.1.1
djangorestframework==3.15.2
mysqlclient==2.2.4
python-dotenv==1.0.1
sqlparse==0.5.1
pytz==2024.2
settings.py:
....
# Database
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ.get('MYSQL_DATABASE'),
'USER': os.environ.get('MYSQL_USER'),
'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
'HOST': 'dj1_mariadb',
'PORT': 3306,
}
}
....
docker-compose.yml:
services:
dj1_mariadb:
image: mariadb:latest
container_name: dj1_mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: myrpass
MYSQL_DATABASE: dj1
MYSQL_USER: ab_usr
MYSQL_PASSWORD: mypass
volumes:
- ./data/mariadb:/var/lib/mysql
# apt-get update && apt-get install -y mariadb-client
networks:
- app-network
dj1_pma:
image: phpmyadmin/phpmyadmin
container_name: dj1_pma
restart: always
environment:
PMA_HOST: dj1_mariadb
PMA_USER: ab_usr
PMA_PASSWORD: mypass
ports:
- "8080:80"
depends_on:
- dj1_mariadb
networks:
- app-network
dj1_web:
build:
context: .
dockerfile: Dockerfile
container_name: dj1_web
command: >
sh -c "python3 manage.py collectstatic --noinput && python3 manage.py runserver 0.0.0.0:8000"
volumes:
- ./pr:/app
- ./pr/static:/app/static
ports:
- "8000:8000"
environment:
- MYSQL_DATABASE=dj1
- MYSQL_USER=ab_usr
- MYSQL_PASSWORD=mypass
depends_on:
- dj1_mariadb
networks:
- app-network
networks:
app-network:
driver: bridge
Может ли кто-нибудь помочь мне? http://localhost:8080/ работает хорошо. Но docker django не может подключиться к базе данных:
Взаимосвязь depends_on
требует только запуска зависимости, но она не обязательно готова, о чем свидетельствует сообщение "Не удается подключиться к серверу" в вашем случае.
Один из способов - использовать скрипт MariaDB healthcheck.sh.
services:
dj1_mariadb:
image: mariadb:latest
container_name: dj1_mariadb
restart: always
environment:
MARIADB_ROOT_PASSWORD: myrpass
MARIADB_DATABASE: dj1
MARIADB_USER: ab_usr
MARIADB_PASSWORD: mypass
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
start_period: 10s
interval: 10s
timeout: 5s
retries: 3
volumes:
- ./data/mariadb:/var/lib/mysql
dj1_pma:
...
depends_on:
dj1_mariadb:
condition: service_healthy
dj1_web:
...
depends_on:
dj1_mariadb:
condition: service_healthy
Если это не так, посмотрите журналы на dj1_mariadb
, чтобы понять, почему он не запускается. Также посмотрите FAQ.