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.

Вернуться на верх