Dockerfile: збирання образу контейнера
Коротко: Dockerfile — це текстовий файл із кроками, за якими Docker збирає образ, шаблон для контейнерів.
Докладніше: Образ містить програму, середовище виконання та залежності; з нього запускаються контейнери. Dockerfile описує, як створюється образ, команда за командою. Кожна команда створює шар, який кешується, тож під час перезбирання заново створюються лише змінені шари.
Подробиці
Приклад для застосунку Node.js
FROM node:22-alpine # базовий образ
WORKDIR /app # робоча тека
COPY package*.json ./ # спочатку лише списки пакетів
RUN npm ci --omit=dev # встановити залежності
COPY . . # потім скопіювати решту
EXPOSE 3000 # примітка про порт
USER node # не запускати від root
CMD ["node", "server.js"] # команда запускуЗбирання та запуск:
docker build -t my-app:1.0 .
docker run -p 3000:3000 my-app:1.0
Важливі інструкції
FROM: базовий образ (якомога менший і з фіксованою версією).RUN: виконати команду під час збирання.COPY/ADD: скопіювати файли всередину (віддавайте перевагуCOPY).ENV,ARG: змінні.CMD,ENTRYPOINT: команда під час запуску контейнера.HEALTHCHECK: перевіряє, чи працює застосунок.
Хороша практика
- Використовуйте порядок: рідко змінюване (залежності) спочатку, вихідний код останнім, щоб працював кеш.
.dockerignoreяк.gitignore: не кладітьnode_modules,.git, секрети в образ.- Багатоетапне збирання (multi-stage): збирайте на одному етапі, копіюйте лише результат у тонкий кінцевий образ.
- Не запускайте від root, підтримуйте базовий образ в актуальному стані та перевіряйте на вразливості (
docker scout, Trivy). - Жодних паролів у Dockerfile: вони лишаються видимими в шарах.
Приклад багатоетапного збирання
FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app
FROM gcr.io/distroless/static
COPY --from=build /app /app
CMD ["/app"]Кінцевий образ містить лише готову програму, а не компілятор, і тому малий та менш вразливий до атак.
Див. також: Docker, Безпека контейнерів, Podman і Docker, Змінні середовища