Dockerfile — це текстовий файл з інструкціями, які описують, як зібрати Docker-образ (image).
Навіщо потрібен Dockerfile
Основні задачі:
- автоматизація збірки середовища
- створення відтворюваних образів
- деплой додатків
- ізоляція залежностей
Як використовується Dockerfile
# Збірка образу
docker build -t my-app .
# Запуск контейнера
docker run -p 8080:8080 my-app
Базовий приклад Dockerfile
# базовий образ
FROM openjdk:17
# робоча директорія
WORKDIR /app
# копіювання файлів
COPY target/app.jar app.jar
# команда запуску
CMD ["java", "-jar", "app.jar"]
Основні інструкції Dockerfile
FROM (базовий образ)
FROM ubuntu:22.04
FROM node:20
FROM openjdk:17
WORKDIR (робоча директорія)
WORKDIR /app
COPY (копіювання файлів)
COPY . .
COPY file.txt /app/file.txt
ADD (розширене копіювання)
ADD archive.tar.gz /app/
# автоматично розпаковує архіви
RUN (виконання команд)
RUN apt update && apt install -y curl
RUN npm install
RUN mvn package
CMD (команда за замовчуванням)
CMD ["node", "app.js"]
ENTRYPOINT (жорстка команда запуску)
ENTRYPOINT ["java", "-jar", "app.jar"]
EXPOSE (порт)
EXPOSE 8080
ENV (змінні середовища)
ENV SPRING_PROFILES_ACTIVE=prod
ARG (аргументи збірки)
ARG VERSION=1.0
RUN echo $VERSION
VOLUME (томи)
VOLUME /data
USER (користувач)
USER appuser
Multi-stage build (багатоетапна збірка)
# етап збірки
FROM maven:3.9 AS builder
WORKDIR /build
COPY . .
RUN mvn clean package
# фінальний образ
FROM openjdk:17
COPY --from=builder /build/target/app.jar app.jar
CMD ["java", "-jar", "app.jar"]
Dockerfile та Bash
RUN виконується через shell (часто bash/sh)
RUN echo "Hello from bash"
Можна запускати bash-скрипти
COPY script.sh /app/script.sh
RUN chmod +x /app/script.sh
RUN /app/script.sh
Shell vs Exec форма
# shell (через sh -c)
RUN apt update && apt install -y curl
# exec (рекомендовано для CMD/ENTRYPOINT)
CMD ["java", "-jar", "app.jar"]
.dockerignore
# файли, які не копіюються в образ
node_modules
.git
target
*.log
Оптимізація Dockerfile
# об'єднання команд (менше шарів)
RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
# кешування
COPY package.json .
RUN npm install
COPY . .
Типовий приклад для Spring Boot
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Типові помилки
# використання latest (не відтворювано)
FROM node:latest
# зайві файли в образі
COPY . .
# багато шарів
RUN apt update
RUN apt install -y curl
Де шукати готові Docker-образи
Основне джерело — Docker Hub
# Пошук через CLI
docker search openjdk
На Docker Hub є verified / official images. Вони підтримуються розробниками або Docker. Приклади:
- openjdk
- node
- postgres
- nginx
Як знайти потрібну версію образу
Відкрити сторінку образу, вкладка "Tags". Приклад тегів:
openjdk:17
openjdk:17-jdk
openjdk:17-jdk-slim
openjdk:17-alpine
Що означають теги
:17 # версія Java
:17-jdk # повний JDK
:17-jre # тільки runtime
:slim # мінімальний Debian-based образ
:alpine # дуже легкий (Alpine Linux)
Перевірка образу локально
docker pull openjdk:17-jdk-slim
docker images
Перегляд вмісту образу
docker run -it openjdk:17-jdk-slim bash
Як оцінити якість образу
Дивись:
- Official badge
- кількість завантажень
- дата оновлення
- документацію
- підтримку тегів
Безпека образів
# Сканування на вразливості
docker scan openjdk:17-jdk-slim
# або
trivy image openjdk:17-jdk-slim
Коментарі
Дописати коментар