## Dockerfile

Создает образ на базе которого строится контейнер.

## Standard, Alpine \ Slim Versions of Docker Images

* Стандартный образ Docker: образ основаны на полном дистрибутиве Linux, таком как Ubuntu или Debian, включают в себя широкий спектр предустановленных пакетов и зависимостей. Пример: `FROM python:3.8`

* Alpine Linux Docker: Alpine Linux — это легкий дистрибутив Linux, небольшой и безопасный. Образы Docker на базе Alpine обычно намного меньше стандартных образов, поскольку включают в себя только самое необходимое для запуска приложения. Пример: `FROM python:3.8-alphine`

* Slim образ Docker: образ построены на базе Alpine, поскольку они небольшие и эффективные. Однако они не обязательно основаны на Alpine Linux и могут использовать другие облегченные дистрибутивы Linux, такие как CentOS или Debian. Slim образы обычно включают только необходимые пакеты и зависимости для запуска приложения. Пример: `FROM python:3.8-slim`

![](https://iximiuz.com/you-need-containers-to-build-an-image/kdpv.png)

> Каждый раз, когда Docker встречает `RUN` инструкцию в [Dockerfile](./4.3.2%20Dockerfile.md), он фактически запускает новый контейнер! Image для этого контейнера состоит из базового образа и всех изменений, внесенных предыдущими инструкциями из Dockerfile, становятся новым слоем в создаваемом образе, и процесс повторяется, начиная со следующей инструкции Dockerfile.

### Дюжина инструкций Dockerfile

* **FROM** — задаёт базовый (родительский) образ.
* **LABEL** — описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.

* **ENV** — устанавливает постоянные переменные среды. Переменные служат для использования внутри контейнера.
* **ARG** — задаёт переменные для передачи Docker во время сборки образа. Переменные недоступны во время выполнения контейнера.

* **COPY** — копирует в контейнер файлы и папки.
* **ADD** — копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.

* **WORKDIR** — задаёт рабочую директорию для следующей инструкции.

* **RUN** — выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
* **CMD** — описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.
* **ENTRYPOINT** — предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.

* **EXPOSE** — указывает на необходимость открыть порт (инструкция не открывает порты). Она, скорее, играет роль документации к образу.
* **VOLUME** — создаёт точку монтирования для работы с постоянным хранилищем.

Этим список таких инструкций не исчерпывается. В частности, мы не рассмотрели здесь такие инструкции, как `USER`, `ONBUILD`, `STOPSIGNAL`, `SHELL` и `HEALTHCHECK`. [Вот](https://kapeli.com/cheat_sheets/Dockerfile.docset/Contents/Resources/Documents/index) краткий справочник по инструкциям Dockerfile.

[Список](https://github.com/hoalongnatsu/Dockerfile) с содержимым базовых Dockerfile для разных языков программирования👍

---

[4.3.1 Docker Theme](./4.3.1%20Docker.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.3.3 Persistance Data Theme](./4.3.3%20PersistanceData.md)