Перейти до основного вмісту

Dockerfile

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

Коментарі