Джаного та база даних з Docker.

джерело

Створюємо новий проект.

Файл залежностей requirements.txt

Django
psycopg2

Встановлення ВО та залежностей.

doker

Старт проекту та сервера.

doker

В даному випадку ми не застосовували міграцію і базу даних не було створено.

Тепер завдання полягає в тому, щоб не використовувати папку venv, а встановити залежності всередині образу Docker.

При цьому зробивши так, щоб усі файли проекту залишалися в локальній області для розробки та не переносились усередину контейнера.

Таким чином, все що служить для запуску проекту (оточення) буде ізольовано всередині контейнера.

Створимо файл Dockerfile.

FROM python:3.6 AS django
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
RUN apt update
RUN apt -y install libpq-dev
COPY requirements.txt /app
RUN pip install -r requirements.txt

ENV PYTHONUNBUFFERED 1 - наказує python виводити все в термінал

Запускаємо складання образу

docket build.

і спостерігаємо процес

doker

Бачимо, що просить оновити інсталятор pip.

doker

Додамо команду поновлення як просить.

...
COPY requirements.txt /app
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install -r requirements.txt

Тепер наше завдання запустити образ у контейнері.

Найпростіше це злити через docker-compose up.

Для цього потрібний файл конфігурації docker-compose.yaml.

version: '3.5'
services: 
    django:
        build: .
        restart: always
        ports:
            - 8000:8080

Запускаємо команду складання та запуску контейнера.

docker-compose up

doker

Тепер нам потрібно запустити кілька команд всередині контейнера, щоб підняти веб-сервер з джанго проектом.

Також нам необхідно зробити посилання всередині контейнера на наш каталог із проектом зовні.

version: '3.5'
services: 
    django:
        build: .
        restart: always
        ports:
            - 8000:8000
        working_dir: /app
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - ./blog:/app

Додамо контейнер із PostgreSQL.

db:
    restart: always
    image: postgres:latest
    ports:
        - "5432:5432"
    volumes:
        - ./pg_data:/var/lib/postgresql/data/
    environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=1q2w3e
        - POSTGRES_DB=blog

Тепер додамо файл налаштувань оточення для проекту .env.dev

DEBUG=1
SECRET_KEY=foo
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=blog
SQL_USER=postgres
SQL_PASSWORD=1q2w3e
SQL_HOST=db
SQL_PORT=5432

Увімкнемо його в контейнер.

version: '3.5'
services: 
    django:
        ...
        env_file:
            - ./.env.dev

І пропишемо коннект у settings.py

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", "user"),
        "PASSWORD": os.environ.get("SQL_PASSWORD", "password"),
        "HOST": os.environ.get("SQL_HOST", "localhost"),
        "PORT": os.environ.get("SQL_PORT", "5432"),
    }
}

Перезбираємо контейнери.

docker-compose up --build

Проводимо міграцію.

docker-compose exec django python manage.py migrate --noinput

Точка входу для образу

Використовується для запуску скрипта під час кожного запуску образу.

Наприклад, якщо ми хочемо застосовувати міграцію щоразу, коли запускаємо образ створимо файл entrypoint.sh.

#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

python manage.py flush --no-input
python manage.py migrate

exec "$@"

І хобуємо його в образ.

FROM python:3.6 AS python36
...
RUN mkdir /entry
COPY entrypoint.sh /entry
ENTRYPOINT ["/entry/entrypoint.sh"]

Якщо потрібно використовувати різні Dockerfile для контейнерів.

services:
  service1:
    build:
        context: .
        args:
            - NODE_ENV=local
        dockerfile: Dockerfile_X
    ports:
        - "8765:8765"

Корисні команди

Видалення контейнерів.

docker-compose down -v

Перегляд списку запущених контейнерів

docker ps

Видалити контейнер

docker-compose rm db