Короткий ответ
Dockerfile — текстовый рецепт сборки (исходный код, который можно хранить в Git), а образ — это бинарный артефакт, полученный в результате выполнения этого рецепта командой docker build.
Как это работает подробнее
docker build читает Dockerfile, последовательно выполняет инструкции и производит набор слоёв с метаданными — это и есть образ, сохранённый локально и идентифицируемый по digest. Dockerfile сам по себе не запускается и ничего не хранит — это только инструкция для сборщика.
Пример кода
Dockerfile
FROM node:20
COPY . /app
RUN npm install
CMD ["npm", "start"]Что использовать на практике
- Практика. один и тот же Dockerfile, собранный в разное время (например, при изменившемся базовом образе или зависимостях без фиксации версий), может дать разные по содержимому образы — поэтому важно различать "код инфраструктуры" (Dockerfile в репозитории) и конкретный "артефакт" (собранный и протегированный образ), который реально развёртывается.
Подводные камни
- Риск. хранят только Dockerfile без зафиксированного и опубликованного в реестре образа и пытаются "пересобрать то же самое" на каждом окружении — это не гарантирует идентичность артефакта между dev/staging/prod, если за это время изменились внешние зависимости.