5. Dockerfile
Dockerfile — это текстовый файл с набором инструкций, описывающих, как собрать Docker-образ. Каждая инструкция создаёт новый слой в образе. Правильно составленный Dockerfile — основа эффективной контейнеризации.
Структура Dockerfile
Заголовок раздела «Структура Dockerfile»Базовый Dockerfile для Node.js приложения:
# Базовый образFROM node:20-alpine
# Метаданные образаLABEL version="1.0"
# Рабочая директория внутри контейнераWORKDIR /app
# Копировать файлы зависимостейCOPY package*.json ./
# Установить зависимостиRUN npm ci --only=production
# Копировать исходный кодCOPY . .
# Переменная окруженияENV NODE_ENV=productionENV PORT=3000
# Открыть портEXPOSE 3000
# Команда запускаCMD ["node", "server.js"]Все инструкции Dockerfile
Заголовок раздела «Все инструкции Dockerfile»FROM — базовый образ
Заголовок раздела «FROM — базовый образ»# Обязательная первая инструкцияFROM node:20-alpine
# С алиасом для multi-stage buildsFROM node:20-alpine AS builder
# Пустой образ (для статических бинарников)FROM scratchRUN — выполнить команду при сборке
Заголовок раздела «RUN — выполнить команду при сборке»# Одна командаRUN npm install
# Несколько команд в одном слое (рекомендуется)RUN apt-get update && \ apt-get install -y curl wget && \ rm -rf /var/lib/apt/lists/*
# Exec-форма (без shell)RUN ["npm", "ci"]COPY и ADD — копировать файлы
Заголовок раздела «COPY и ADD — копировать файлы»# Копировать файлCOPY package.json /app/package.json
# Копировать директориюCOPY src/ /app/src/
# Использовать .dockerignore для исключенийCOPY . /app
# ADD может распаковывать архивы и загружать URLADD app.tar.gz /app# Но COPY предпочтительнее для обычных файловENV — переменные окружения
Заголовок раздела «ENV — переменные окружения»# Установить переменнуюENV NODE_ENV=production
# Несколько переменныхENV PORT=3000 \ HOST=0.0.0.0 \ LOG_LEVEL=infoEXPOSE — документировать порты
Заголовок раздела «EXPOSE — документировать порты»# Сообщить, что контейнер слушает этот порт# (не публикует порт автоматически!)EXPOSE 3000EXPOSE 80/tcpEXPOSE 53/udpWORKDIR — рабочая директория
Заголовок раздела «WORKDIR — рабочая директория»WORKDIR /app# Создаёт директорию если не существует# Все последующие инструкции выполняются в /appCMD vs ENTRYPOINT
Заголовок раздела «CMD vs ENTRYPOINT»# CMD — команда по умолчанию (можно переопределить)CMD ["node", "server.js"]CMD npm start
# ENTRYPOINT — точка входа (нельзя переопределить без --entrypoint)ENTRYPOINT ["node"]CMD ["server.js"] # аргумент для ENTRYPOINT
# Переопределение при запуске:docker run myapp # → node server.jsdocker run myapp app.js # → node app.jsdocker run --entrypoint python myapp script.py # → python script.pyARG — аргументы сборки
Заголовок раздела «ARG — аргументы сборки»# Объявить аргумент сборкиARG NODE_VERSION=20FROM node:${NODE_VERSION}-alpine
ARG APP_VERSIONLABEL version=${APP_VERSION}
# Передать при сборке# docker build --build-arg APP_VERSION=1.2.3 .USER — пользователь
Заголовок раздела «USER — пользователь»# Создать непривилегированного пользователяRUN addgroup -S appgroup && adduser -S appuser -G appgroupUSER appuserHEALTHCHECK — проверка работоспособности
Заголовок раздела «HEALTHCHECK — проверка работоспособности»HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1VOLUME — точки монтирования
Заголовок раздела «VOLUME — точки монтирования»# Объявить том для данныхVOLUME /app/dataVOLUME /var/log