From 895100c2ac03aec25d81cf8666d1f3b399ab599f Mon Sep 17 00:00:00 2001 From: chase Date: Mon, 4 May 2026 11:59:55 +0300 Subject: [PATCH] push --- docs/3. Dockerfile — сборка образа и COPY.md | 22 +++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/docs/3. Dockerfile — сборка образа и COPY.md b/docs/3. Dockerfile — сборка образа и COPY.md index 2e90131..4fe42cb 100644 --- a/docs/3. Dockerfile — сборка образа и COPY.md +++ b/docs/3. Dockerfile — сборка образа и COPY.md @@ -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] ... Для обычных файлов предпочитают **`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**.