Docker¶
ncorn можно контейнеризировать с помощью Docker для удобного развёртывания.
Базовый Dockerfile¶
FROM python:3.11-slim
WORKDIR /app
# Установка ncorn
RUN pip install ncorn
# Копирование приложения
COPY . .
# Запуск ncorn
CMD ["ncorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
Сборка и запуск¶
docker build -t ncorn-app .
docker run -d -p 8000:8000 --name myapp ncorn-app
Docker с SSL¶
FROM python:3.11-slim
WORKDIR /app
RUN pip install ncorn
COPY certs/ ./certs/
COPY app.py .
CMD ["ncorn", "app:app", "--host", "0.0.0.0", "--port", "443", \
"--ssl-keyfile", "certs/key.pem", \
"--ssl-certfile", "certs/cert.pem"]
Мультистейдж сборка¶
Для меньших образов:
# Стадия сборки
FROM python:3.11-slim as builder
WORKDIR /app
RUN pip install --user ncorn
# Рантайм стадия
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app
ENV PATH=/root/.local/bin:$PATH
CMD ["ncorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
Docker Compose¶
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- NCORN_HOST=0.0.0.0
- NCORN_PORT=8000
volumes:
- .:/app
# С SSL
web-ssl:
build: .
ports:
- "443:443"
volumes:
- ./certs:/app/certs:ro
command: >
ncorn app:app
--host 0.0.0.0
--port 443
--ssl-keyfile certs/key.pem
--ssl-certfile certs/cert.pem
Docker для продакшена¶
FROM python:3.11-slim
WORKDIR /app
RUN pip install --no-cache-dir ncorn
# Создание не-root пользователя
RUN useradd -m appuser
USER appuser
COPY --chown=appuser:appuser . .
EXPOSE 8000
CMD ["ncorn", "app:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
Health Check¶
services:
web:
build: .
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
ports:
- "8000:8000"
Kubernetes¶
apiVersion: v1
kind: Pod
metadata:
name: ncorn-app
spec:
containers:
- name: web
image: ncorn-app:latest
ports:
- containerPort: 8000
env:
- name: NCORN_HOST
value: "0.0.0.0"
- name: NCORN_PORT
value: "8000"
resources:
limits:
memory: "512Mi"
cpu: "500m"
Лучшие практики¶
- Используйте не-root пользователя в контейнерах
- Установите правильные лимиты ресурсов
- Используйте health checks
- Включите SSL в продакшене
- Используйте мультистейдж сборки для меньших образов
- Не кэшируйте зависимости в продакшене (
--no-cache-dir)