This commit is contained in:
chase
2026-05-04 11:59:55 +03:00
parent ccec89718a
commit 895100c2ac
@@ -47,6 +47,7 @@ docker build -t имя:тег -f Dockerfile /путь/к/контексту
Ниже - что писать, какие есть параметры и на что обратить внимание.
## `FROM` - базовый образ
**Синтаксис:**
@@ -63,6 +64,7 @@ FROM [--platform=linux/amd64] image[:tag|@digest] [AS name]
Каждый новый `FROM` начинает **новый этап**; предыдущие слои остаются в цепочке сборки, в финальный образ попадает только последний этап (если не копировать из предыдущих через `COPY --from`).
## `RUN` - команды на этапе сборки
Две формы записи:
@@ -91,6 +93,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \
Типы `type=` включают `cache`, `bind`, `secret`, `ssh` и др. [документация BuildKit mounts](https://docs.docker.com/build/buildkit/).
## `WORKDIR` - рабочий каталог
```dockerfile
@@ -100,6 +103,7 @@ WORKDIR /app
Создаёт каталог, если его нет. Влияет на последующие `RUN`, `COPY`, `CMD`, `ENTRYPOINT` в **exec-форме** относительно пути (часть команд всё равно лучше указывать абсолютно).
Можно несколько раз - каждый раз новый путь.
## `COPY` - файлы в образ
```dockerfile
@@ -117,6 +121,7 @@ COPY ["--chown=user:group", "src с пробелом", "/dest/"]
Несколько `src` - последний аргумент должен быть **каталогом** с `/` на конце.
## `ADD` - расширенное копирование
```dockerfile
@@ -130,6 +135,7 @@ ADD [--chown=user:group] [--chmod=755] <src> ... <dest>
Для обычных файлов предпочитают **`COPY`**.
## `ENV` - переменные окружения
```dockerfile
@@ -142,6 +148,7 @@ ENV KEY="значение с пробелами"
- Одна форма `ENV A=B C=D` задаёт несколько переменных.
- Значения можно подставлять в строках как `$KEY` или `${KEY}`.
## `ARG` - переменные только при сборке
```dockerfile
@@ -154,6 +161,7 @@ ARG GIT_COMMIT
- После `FROM` переменные `ARG` нужно **объявить снова**, если они нужны в этом этапе.
- **Не храните секреты в `ARG`** без BuildKit secrets: значения могут попасть в историю слоёв (`docker history`).
## `EXPOSE` - какие порты «слушает» приложение
```dockerfile
@@ -164,6 +172,7 @@ EXPOSE 53/udp
Это **метаданные** и подсказка для `docker run -P`. Порт на хост не открывается, пока не укажете `-p` или Compose `ports:`.
## `VOLUME` - каталог для данных вне слоя записи
```dockerfile
@@ -173,6 +182,7 @@ VOLUME /var/log/app
Объявляет точку, куда при запуске без явного `-v` Docker может подставить **анонимный том**. Часто для данных БД или логов. **Не путать** с явным монтированием в `docker run -v`.
## `USER` - под каким UID/GID работать
```dockerfile
@@ -182,6 +192,7 @@ USER 1000:1000
Все последующие `RUN` и процесс по умолчанию при старте — от этого пользователя (если не переопределить в `docker run -u`).
## `LABEL` - метаданные образа
```dockerfile
@@ -191,6 +202,7 @@ LABEL version="1.0" description="My app"
Пары ключ–значение; удобно для OCI-аннотаций (`org.opencontainers.image.*`), реестров, политик.
## `CMD` - что выполнять при запуске по умолчанию
Три формы:
@@ -210,6 +222,7 @@ CMD command param1 param2
**Переопределение:** `docker run image ls` заменит `CMD` на `ls` (если не трогать `ENTRYPOINT`).
В файле допустима **одна** инструкция `CMD` (если несколько, то последняя выполняется).
## `ENTRYPOINT` - фиксированная «обёртка» запуска
```dockerfile
@@ -222,6 +235,7 @@ ENTRYPOINT exec java -jar app.jar
Частый паттерн: `ENTRYPOINT` = скрипт или бинарник, `CMD` = аргументы по умолчанию. Тогда `docker run myimage --help` передаёт `--help` в entrypoint.
## `STOPSIGNAL` - сигнал остановки
```dockerfile
@@ -230,6 +244,7 @@ STOPSIGNAL SIGTERM
Какой сигнал послать процессу при `docker stop` (по умолчанию обычно `SIGTERM`, потом `SIGKILL`). Нужен редко (например, для JVM или nginx с graceful shutdown).
## `HEALTHCHECK` - проверка «жив ли» контейнер
```dockerfile
@@ -248,6 +263,7 @@ HEALTHCHECK [OPTIONS] CMD command
`CMD` здесь - команда проверки (часто `curl`/`wget` к localhost или скрипт).
`HEALTHCHECK NONE` - отключить наследованный healthcheck от базового образа.
## `SHELL` - оболочка для shell-форм
```dockerfile
@@ -257,6 +273,7 @@ SHELL ["/bin/bash", "-c"]
Меняет команду для **shell-формы** `RUN`, `CMD`, `ENTRYPOINT` на Windows/Linux.
## `ONBUILD` - отложенная инструкция для «дочерних» образов
```dockerfile
@@ -283,6 +300,7 @@ COPY --from=build /app/dist /usr/share/nginx/html
Имена этапов - в `AS`; копирование - `COPY --from=build` или `--from=0` (индекс этапа).
## `COPY` vs `ADD` — что выбрать
| Задача | Инструкция |
@@ -291,6 +309,7 @@ COPY --from=build /app/dist /usr/share/nginx/html
| Распаковать локальный `.tar` в слой | `ADD` (или `COPY` + `RUN tar`) |
| Скачать по URL | лучше `RUN curl`/`wget` с проверкой checksum; `ADD URL` — редко |
## `.dockerignore`
В корне **контекста** — шаблоны путей, которые **не отправляются** демону при сборке и недоступны для `COPY`/`ADD`:
@@ -302,6 +321,7 @@ node_modules
*.md
```
## Сборка и просмотр слоёв
```
@@ -309,7 +329,7 @@ docker build -t my-web:1.0 -f Dockerfile .
docker history my-web:1.0
```
---
## Готовый пример в репозитории
Рабочие `Dockerfile` с `COPY`, `EXPOSE`, `HEALTHCHECK` и т.д. — в `docker/examples/multi-service/` (`web`, `api`, `proxy`). Связка с Compose — в части **4**.