[Python] Docker. How to fill volume at startup

Discussão em 'Python' iniciado por Stack, Janeiro 24, 2025.

  1. Stack

    Stack Membro Participativo

    I use docker-compose to run a Django project.

    My goal is for docker to start filled with existing data (statics, database, and all the contents of the media directory).

    Currently, statics are collected and distributed via volume. The database starts from a prepared dump.

    /media directory added to .dockerignore

    The question is, how to correctly fill the media volume from the media directory when you first run docker compose (that is, when the media volume is still empty)?

    docker-compose.yaml file:

    volumes:
    mysql_data:
    static:
    media:

    services:

    db:
    image: mysql:8.0
    restart: always
    volumes:
    - mysql_data:/var/lib/mysql
    - ./database_dump.sql:/docker-entrypoint-initdb.d/dump.sql
    environment:
    - MYSQL_DATABASE=${MYSQL_DATABASE}
    - MYSQL_USER=${MYSQL_USER}
    - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    env_file:
    - .env

    backend:
    build: ./
    depends_on:
    - db
    restart: always
    volumes:
    - static:/app/static/
    - media:/app/media/
    env_file:
    - .env

    nginx:
    build: ./gateway/
    depends_on:
    - backend
    ports:
    - "8000:80"
    restart: always
    volumes:
    - static:/static/
    - media:/media/


    Dockerfile:

    FROM python:3.11
    WORKDIR /app
    ENV PYTHONDONTWRITEBYTECODE=1
    ENV PYTHONUNBUFFERED=1
    ENV DJANGO_SETTINGS_MODULE='app.settings'
    RUN apt-get update && apt-get install -y netcat-openbsd
    COPY ./requirements.pip ./
    RUN pip install --upgrade pip && pip install -r requirements.pip --no-cache-dir
    COPY . .
    RUN python manage.py collectstatic --no-input
    RUN chmod +x ./entrypoint.sh
    EXPOSE 8000
    ENTRYPOINT ["./entrypoint.sh"]


    entrypoint.sh:

    #!/bin/sh
    echo "Waiting for MySQL..."
    while ! nc -z $MYSQL_HOST $MYSQL_PORT; do
    sleep 0.1
    done
    echo "MySQL started"
    python manage.py migrate --no-input
    gunicorn app.asgi:application \
    --bind 0.0.0.0:8000 \
    --workers 8 \
    --worker-class uvicorn.workers.UvicornWorker
    exec "$@"

    Continue reading...

Compartilhe esta Página