Ответ
Есть два основных подхода, которые я использую в зависимости от этапа разработки.
1. Для разработки: Монтирование тома (Volume Bind Mount) Это позволяет синхронизировать локальные файлы с контейнером без пересборки образа.
docker run -v $(pwd)/src:/app/src my-app:latest
Или в docker-compose.yml:
services:
app:
build: .
volumes:
- ./src:/app/src # Локальная папка : путь в контейнере
2. Для продакшена: Копирование в образ (COPY в Dockerfile) Код становится частью образа, что обеспечивает воспроизводимость и безопасность.
FROM node:18-alpine
WORKDIR /app
# Копируем package.json отдельно для кэширования слоев
COPY package*.json .
RUN npm ci --only=production
# Копируем остальной исходный код
COPY src/ ./src/
CMD ["node", "src/index.js"]
Мой типичный workflow:
- Во время разработки использую
volumesдля мгновенного обновления кода. - Для CI/CD и продакшн-сборки использую
COPYв многостадийном Dockerfile, чтобы итоговый образ содержал только скомпилированное приложение и зависимости, без исходников и инструментов сборки.