Docker
Установка Docker
https://www.docker.com/get-started
Скачайте и установите Docker Desktop. Docker Desktop включает в себя Docker Engine, Docker CLI, Docker Compose и Kubernetes для локальной разработки
wsl --install
Перезапустить комп
Сборки пайтона
https://hub.docker.com/_/python
Начало работы
Чтобы проверить что всё работает:
docker --version
docker run hello-world
Подготовка к контейнеризации
Создать requirements.txt из виртуального окружения:
pip freeze > requirements.txt
asgiref==3.8.1
beautifulsoup4==4.12.3
certifi==2024.12.14
charset-normalizer==3.4.1
Django==4.2.17
django-crontab==0.7.1
django-debug-toolbar==4.4.6
django-js-asset==3.0.1
gunicorn==22.0.0
html5lib==1.1
idna==3.10
packaging==24.2
pillow==11.0.0
psycopg2==2.9.10
python-dotenv==1.0.1
requests==2.32.3
six==1.17.0
soupsieve==2.6
sqlparse==0.5.2
tzdata==2024.2
Unidecode==1.3.8
urllib3==2.3.0
webencodings==0.5.1
whitenoise==6.9.0
pip install --no-cache-dir -r requirements.txt
В settings.py прописать всё для статики:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = 'media/'
MEDIA_ROOT = BASE_DIR / 'media'
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
MIDDLEWARE = [
...
"whitenoise.middleware.WhiteNoiseMiddleware",
...
]
В settings.py прописать всё для секюритности окружения:
from dotenv import load_dotenv
load_dotenv()
SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG = os.getenv('DEBUG', '0') == '1'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '').split()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('DB_USER'),
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': os.getenv('DB_HOST'),
'PORT': os.getenv('DB_PORT'),
}
}
Создать .env
SECRET_KEY='django-insecure-блаблабла'
DEBUG=1
ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
DB_NAME=inventedworlds
DB_USER=andedali
DB_PASSWORD=Pass
# DB_HOST=localhost
DB_HOST=db
DB_PORT=5432
Создать .dockerignore
.git
.gitignore
.env
.venv
.vscode
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env/
venv/
*.log
staticfiles/
media/
Создать Dockerfile и docker-compose.yml
Dockerfile
FROM python:3.12.9-bookworm
# Установка системных зависимостей
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
libpq-dev \
cron \
postgresql-client \
netcat-openbsd \
&& rm -rf /var/lib/apt/lists/*
# Обход ограничений PEP 668
ENV PIP_BREAK_SYSTEM_PACKAGES=1
# Рабочая директория
WORKDIR /app
# Копируем зависимости
COPY requirements.txt .
# Установка Python-зависимостей
RUN pip install --no-cache-dir -r requirements.txt
# Копируем весь проект
COPY . .
# Сборка статики Django
RUN python manage.py collectstatic --noinput --clear
# Настройка cron-логов
RUN ln -sf /dev/stdout /app/cron.log
# Команда запуска
CMD ["sh", "-c", "\
python manage.py migrate && \
python manage.py crontab add && \
cron && \
gunicorn inventedworlds.wsgi:application --bind 0.0.0.0:8000\
"]
docker-compose.yml
services:
web:
build: .
restart: unless-stopped
ports:
- "8000:8000"
env_file:
- .env
environment:
- DJANGO_SETTINGS_MODULE=inventedworlds.settings
- PYTHONUNBUFFERED=1
depends_on:
db:
condition: service_healthy
volumes:
- static_volume:/app/staticfiles
- media_volume:/app/media
command: >
sh -c "while ! /usr/bin/pg_isready -h db -U $$DB_USER -d $$DB_NAME; do sleep 2; done;
python manage.py migrate;
python manage.py crontab add;
cron;
gunicorn inventedworlds.wsgi:application --bind 0.0.0.0:8000"
db:
image: postgres:15
restart: unless-stopped
env_file:
- .env
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data/
healthcheck:
test: ["CMD-SHELL", "/usr/bin/pg_isready -U ${DB_USER} -d ${DB_NAME}"]
interval: 5s
timeout: 5s
retries: 10
ports:
- "5432:5432"
volumes:
postgres_data:
static_volume:
media_volume:
Запуск контейнера
Остается кеш
docker-compose up --build
Полная пересборка
docker-compose down -v; docker-compose build --no-cache; docker-compose up
Проверить статику после запуска контейнера
docker-compose exec web ls -la /app/staticfiles
docker-compose exec web chmod -R 755 /app/staticfiles
Работа с БД
docker-compose exec web python manage.py makemigrations
docker-compose exec web python manage.py migrate
docker-compose exec web python manage.py createsuperuser
docker-compose exec db psql -U andedali -d inventedworlds -c "SELECT * FROM auth_user;"
фикстуры
сохранить
python -Xutf8 manage.py dumpdata lessons.Article --indent 4 --format json -o fixtures/lessons/arricle.json
загрузить
docker-compose exec web python manage.py loaddata fixtures/lessons/arricle.json
docker-compose exec web python manage.py loaddata fixtures/lessons/content.json
docker-compose exec web python manage.py loaddata fixtures/news/parsers.json
После внесения изменений локально
docker-compose restart web
Комментарии
Комментариев пока нет.
Чтобы оставлять комментарии, войдите или зарегистрируйтесь.