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