04 сент. 2023
Sergey Latskin
200
docker build
# Docker Build Памятка
`docker build` - это команда Docker, которая используется для создания образа Docker из Dockerfile и контекста сборки. Контекст сборки - это набор файлов, находящихся в указанном пути или URL. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать для создания образа.
## Синтаксис
```bash
docker build [OPTIONS] PATH | URL | -
```
## Опции
- `-t, --tag` - Имя и опционально тег в формате 'name:tag'. Используйте это для тегирования образа для последующего использования.
- `--build-arg` - Устанавливает переменные среды, которые доступны во время сборки.
- `--file, -f` - Имя Dockerfile. По умолчанию `Dockerfile`.
- `--no-cache` - Не использовать кэш при сборке образа.
- `--rm` - Удалить промежуточные контейнеры после успешной сборки.
- `--pull` - Всегда пытаться вытянуть новейшую версию образа.
## Примеры
1. Сборка образа Docker из Dockerfile в текущем каталоге:
```bash
docker build -t my-app .
```
2. Сборка образа Docker из Dockerfile, расположенного по определенному пути:
```bash
docker build -t my-app -f /path/to/a/Dockerfile .
```
3. Сборка образа Docker без использования кэша:
```bash
docker build --no-cache -t my-app .
```
4. Сборка образа Docker с использованием переменных среды:
```bash
docker build --build-arg MY_VAR=value -t my-app .
```
## Запуск образа Docker
После того, как вы собрали образ Docker, вы можете запустить его, используя команду `docker run`.
```bash
docker run -d -p 8080:80 my-app
```
В этом примере `-d` означает, что контейнер будет запущен в фоновом режиме, а `-p` используется для перенаправления порта (в данном случае порт 8080 на хосте будет перенаправлен на порт 80 в контейнере).
Docker build - это команда, которая создает образ Docker из Dockerfile и контекста сборки. Контекст сборки - это набор файлов, находящихся в указанном пути или URL. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать для создания образа.
## Как использовать Docker Build
Вот базовый синтаксис команды Docker build:
```bash
docker build [OPTIONS] PATH | URL | -
```
- `OPTIONS` - это необязательные флаги, которые вы можете использовать с командой `docker build`. Например, `-t` позволяет вам тегировать ваш образ.
- `PATH` | `URL` | `-` - это путь к каталогу, содержащему Dockerfile и контекст сборки. Это может быть URL-адрес репозитория git или URL-адрес, который указывает на tar-архив.
## Пример
Допустим, у вас есть репозиторий git, содержащий ваш Dockerfile и все необходимые файлы для вашего приложения. Вы можете собрать образ Docker прямо из этого репозитория следующим образом:
```bash
docker build -t my-app https://github.com/username/my-app.git
```
В этом примере:
- `-t my-app` - это тег, который вы присваиваете вашему образу. Это полезно для управления и идентификации образов.
- `https://github.com/username/my-app.git` - это URL-адрес вашего репозитория git. Docker будет клонировать этот репозиторий и использовать его как контекст сборки.
После выполнения этой команды Docker создаст образ `my-app` из вашего репозитория. Вы можете проверить, что образ был успешно создан, выполнив команду `docker images`.
## Заключение
Команда `docker build` - это мощный инструмент для создания образов Docker прямо из вашего репозитория git. Это упрощает процесс развертывания и обновления вашего приложения.
Docker build - это команда, которая создает образ Docker из Dockerfile и контекста строителя. Контекст строителя - это набор файлов в указанном месте. По умолчанию путь к Dockerfile - это текущий каталог.
Для сборки образа Docker из репозитория, вам нужно выполнить следующие шаги:
1. **Клонировать репозиторий**
Сначала вы должны клонировать репозиторий, который содержит ваш Dockerfile. Вы можете сделать это с помощью команды `git clone`. Например:
```bash
git clone https://github.com/your-repository.git
```
2. **Перейти в директорию репозитория**
Затем перейдите в директорию, которую вы только что клонировали:
```bash
cd your-repository
```
3. **Собрать Docker образ**
Теперь вы можете собрать Docker образ с помощью команды `docker build`. Например:
```bash
docker build -t your-image-name .
```
В этой команде `-t` используется для того, чтобы задать имя и тег образа, а `.` указывает на текущую директорию (которая должна содержать Dockerfile).
После выполнения этих шагов, Docker образ будет собран из вашего репозитория. Вы можете проверить это, выполнив команду `docker images`, которая покажет вам список всех доступных образов Docker.
- `--add-host`: Эта команда позволяет добавить пользовательское соответствие между хостом и IP (host:ip).
- `--build-arg`: Эта команда устанавливает переменные во время сборки.
- `--cache-from`: Эта команда указывает образы, которые следует рассматривать как источники кэша.
- `--cgroup-parent`: Эта команда определяет родительскую контрольную группу для контейнера.
- `--compress`: Эта команда сжимает контекст сборки с использованием gzip.
- `--cpu-period`: Эта команда ограничивает период CPU CFS (Completely Fair Scheduler).
- `--cpu-quota`: Эта команда ограничивает квоту CPU CFS (Completely Fair Scheduler).
- `--cpu-shares -c`: Эта команда устанавливает долю CPU (относительный вес).
- `--cpuset-cpus`: Эта команда определяет, в каких CPU разрешить выполнение (0-3, 0,1).
- `--cpuset-mems`: Эта команда определяет, в каких MEM разрешить выполнение (0-3, 0,1).
- `--disable-content-trust true`: Эта команда пропускает проверку изображения.
- `--file -f`: Эта команда указывает имя Dockerfile (по умолчанию PATH/Dockerfile).
- `--force-rm`: Эта команда всегда удаляет промежуточные контейнеры.
- `--iidfile`: Эта команда записывает ID изображения в файл.
- `--isolation`: Эта команда определяет технологию изоляции контейнера.
- `--label`: Эта команда устанавливает метаданные для изображения.
- `--memory -m`: Эта команда ограничивает объем памяти.
- `--memory-swap`: Эта команда устанавливает лимит свопа, равный памяти плюс своп: -1 для включения неограниченного свопа.
- `--network`: Эта команда устанавливает режим сети для инструкций RUN во время сборки.
- `--no-cache`: Эта команда не использует кэш при сборке изображения.
- `--platform`: Эта команда устанавливает платформу, если сервер способен работать с несколькими платформами.
- `--pull`: Эта команда всегда пытается загрузить более новую версию изображения.
- `--quiet -q`: Эта команда подавляет вывод сборки и печатает ID изображения при успешном завершении.
- `--rm true`: Эта команда удаляет промежуточные контейнеры после успешной сборки.
- `--security-opt`: Эта команда устанавливает параметры безопасности.
- `--shm-size`: Эта команда устанавливает размер /dev/shm.
- `--squash`: Эта команда объединяет вновь созданные слои в один новый слой.
- `--tag -t`: Эта команда указывает имя и, возможно, тег в формате name:tag.
- `--target`: Эта команда устанавливает целевую стадию сборки для сборки.
- `--ulimit`: Эта команда устанавливает параметры ulimit.
Для сборки Docker образа из архива и файла вам понадобится Dockerfile. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать для создания образа.
Вот шаги, которые вы должны следовать:
1. Создайте Dockerfile в своем проекте. Он должен выглядеть примерно так:
```markdown
# Используйте официальный образ Python с вашей предпочитаемой версией Python
FROM python:3.8
# Установите рабочую директорию в контейнере
WORKDIR /app
# Скопируйте текущую директорию в рабочую директорию контейнера
ADD . /app
# Установите все необходимые пакеты
RUN pip install --no-cache-dir -r requirements.txt
# Запустите приложение, когда контейнер запускается
CMD ["python", "your-app.py"]
```
2. Соберите Docker образ, используя команду `docker build`. Не забудьте указать точку в конце команды, это означает, что Docker должен искать Dockerfile в текущей директории.
```markdown
docker build -t your-image-name .
```
3. После успешной сборки вы можете запустить свой образ с помощью команды `docker run`.
```markdown
docker run -p 4000:80 your-image-name
```
В этом примере, ваше приложение будет доступно по адресу `localhost:4000` в вашем веб-браузере.
Примечание: Если вы хотите собрать Docker образ из архива, вам нужно сначала извлечь файлы из архива в вашу рабочую директорию.
Docker контейнеры используют теги для идентификации различных версий образов Docker. Это позволяет разработчикам и системным администраторам легко отслеживать, управлять и развертывать различные версии образов Docker.
## Структура тега Docker
Структура тега Docker обычно выглядит следующим образом:
```
repository:tag
```
где:
- `repository` - это имя репозитория Docker, в котором хранится образ.
- `tag` - это уникальный идентификатор, который используется для идентификации конкретной версии образа Docker в репозитории.
Например, в `ubuntu:18.04`:
- `ubuntu` - это имя репозитория.
- `18.04` - это тег, который идентифицирует конкретную версию образа Ubuntu.
## Использование тегов Docker
Теги Docker обычно используются при сборке и развертывании образов Docker. Например, вы можете использовать следующую команду для сборки образа Docker с определенным тегом:
```bash
docker build -t repository:tag .
```
Вы также можете использовать теги Docker при запуске контейнера Docker. Например, вы можете использовать следующую команду для запуска контейнера Docker с определенным образом и тегом:
```bash
docker run -d -p 80:80 repository:tag
```
## Важность тегов Docker
Теги Docker важны по следующим причинам:
- **Версионирование**: Теги Docker позволяют разработчикам и системным администраторам легко отслеживать и управлять различными версиями образов Docker.
- **Организация**: Теги Docker помогают организовать образы Docker в репозитории.
- **Управление развертыванием**: Теги Docker позволяют разработчикам и системным администраторам контролировать, какие версии образов Docker должны быть развернуты в определенное время.
Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать в командной строке для создания образа Docker. Используя `docker build`, пользователи могут создавать автоматизированные сборки, которые включают в себя все зависимости в одном образе. Это делает его более простым в использовании, поскольку пользователю не нужно устанавливать все зависимости вручную.
## Структура Dockerfile
Dockerfile обычно начинается с указания базового образа. Затем он выполняет необходимые команды для добавления файлов, установки пакетов и других настроек, и в конце указывает, какой командой нужно запустить контейнер.
Пример Dockerfile:
```dockerfile
# Use an official Python runtime as a parent image
FROM python:3.7-slim
# Set the working directory in the container to /app
WORKDIR /app
# Add the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
```
## Команды Dockerfile
- `FROM` устанавливает базовый образ для последующих инструкций.
- `WORKDIR` устанавливает рабочую директорию для последующих инструкций.
- `ADD` копирует новые файлы, каталоги или удаленные файлы URL и добавляет их в файловую систему образа.
- `RUN` выполняет любую команду в новом слое поверх текущего образа и коммитит результаты.
- `EXPOSE` информирует Docker, что контейнер слушает указанные сетевые порты во время выполнения.
- `ENV` устанавливает переменную окружения.
- `CMD` предоставляет значения по умолчанию для исполняемого контейнера.
## Использование Dockerfile
Чтобы собрать образ Docker из Dockerfile, вы можете использовать команду `docker build`. Например:
```bash
docker build -t your-image-name .
```
Эта команда считывает Dockerfile в текущем каталоге, собирает новый образ Docker и присваивает ему имя `your-image-name`.
`FROM` - это команда в Dockerfile, которая указывает базовый образ для последующих инструкций. Это первая инструкция, которую следует указать в Dockerfile.
Синтаксис команды `FROM` выглядит следующим образом:
```Dockerfile
FROM <имя образа>[:<тег>]
```
- `<имя образа>`: это имя базового образа Docker, который вы хотите использовать. Например, `ubuntu`, `alpine`, `nginx`, `node`, `python` и т.д.
- `<тег>`: это опциональный параметр, который позволяет указать конкретную версию образа. Например, `ubuntu:18.04`.
Пример использования команды `FROM`:
```Dockerfile
FROM ubuntu:18.04
```
Образы Docker можно искать в Docker Hub, который является облачным репозиторием, где хранятся и распространяются образы Docker. Docker Hub предлагает как публичные, так и приватные репозитории.
Вы можете посетить [Docker Hub](https://hub.docker.com/) и использовать поисковую строку для поиска образов. Например, если вы ищете образ Ubuntu, просто введите "Ubuntu" в поисковую строку и нажмите Enter.
Кроме того, вы можете использовать команду `docker search` в командной строке для поиска образов. Например:
```bash
docker search ubuntu
```
Эта команда вернет список образов Ubuntu, доступных на Docker Hub.
`ulimit` - это команда Unix, которая предоставляет контроль над ресурсами системы. Docker может использовать `ulimit` для ограничения ресурсов контейнера.
Когда вы запускаете контейнер с помощью Docker, вы можете использовать флаг `-ulimit` для установки ограничений на ресурсы, которые контейнер может использовать.
Вот пример использования команды `-ulimit` в Docker:
```bash
docker run -it --ulimit nofile=1024:1024 ubuntu
```
В этом примере `nofile=1024:1024` устанавливает мягкое и жесткое ограничения на количество открытых файлов для контейнера. Мягкое ограничение может быть увеличено пользователем до уровня жесткого ограничения. Жесткое ограничение может быть увеличено только суперпользователем.
Вы можете установить различные ограничения, такие как `core` (ограничение на размер дампа памяти), `cpu` (ограничение на использование процессора), `data` (ограничение на размер данных), `fsize` (ограничение на размер файла) и многие другие.
Однако следует отметить, что не все ограничения `ulimit` могут быть установлены в Docker. Например, ограничения `nice` и `priority` не поддерживаются.
Важно понимать, что установка ограничений `ulimit` может повлиять на работу контейнера. Например, если вы установите ограничение на количество открытых файлов слишком низко, это может привести к ошибкам в работе контейнера.
Команда `--build-arg` в Docker используется для передачи аргументов сборки во время процесса сборки образа Docker. Это может быть полезно, когда вам нужно передать определенные значения во время сборки, которые используются в Dockerfile.
Синтаксис команды выглядит следующим образом:
```bash
docker build --build-arg =
```
Где `` - это имя аргумента, которое вы хотите передать, а `` - это соответствующее значение этого аргумента.
Например, если у вас есть Dockerfile, который использует аргумент сборки `VERSION`, вы можете передать значение этого аргумента следующим образом:
```bash
docker build --build-arg VERSION=1.0.0 .
```
В этом случае, `VERSION` будет иметь значение `1.0.0` во время процесса сборки.
В Dockerfile, вы можете использовать аргументы сборки с помощью инструкции `ARG`. Например:
```Dockerfile
FROM node:14
ARG VERSION
RUN echo "Version: $VERSION"
```
В этом примере, `VERSION` будет заменено на значение, которое вы передали с помощью `--build-arg` во время сборки.
Обратите внимание, что аргументы сборки не сохраняются в собранном образе. Если вы хотите, чтобы переменные были доступны во время выполнения контейнера, вы должны использовать инструкцию `ENV` в Dockerfile.
## --security-opt
Команда `--security-opt` в Docker используется для настройки параметров безопасности контейнера. Она позволяет управлять такими функциями, как профили безопасности и метки.
Синтаксис команды выглядит следующим образом:
```bash
docker run --security-opt [option]=[value]
```
### Примеры использования
1. **AppArmor**
AppArmor - это система безопасности на уровне ядра Linux, которая помогает ограничивать действия процессов на основе определенных правил. Вы можете использовать `--security-opt` для указания профиля AppArmor для вашего контейнера.
```bash
docker run --security-opt apparmor=your_apparmor_profile
```
2. **Seccomp**
Seccomp (безопасная вычислительная модель) - это другая функция безопасности Linux, которая позволяет ограничивать системные вызовы, которые может выполнять процесс. Вы можете использовать `--security-opt` для указания профиля Seccomp для вашего контейнера.
```bash
docker run --security-opt seccomp=your_seccomp_profile.json
```
3. **SELinux**
SELinux (Security-Enhanced Linux) - это модуль безопасности ядра Linux, который предоставляет механизм для поддержки политики безопасности доступа. Вы можете использовать `--security-opt` для управления метками SELinux.
```bash
docker run --security-opt label=user:USER
docker run --security-opt label=role:ROLE
docker run --security-opt label=type:TYPE
docker run --security-opt label=level:LEVEL
```
### Предупреждения
- Не все опции безопасности доступны на всех платформах и во всех конфигурациях.
- Некоторые опции безопасности могут существенно влиять на поведение и функциональность вашего контейнера.
- Всегда тестируйте свои контейнеры и их безопасность перед развертыванием в производственной среде.
Команда `--isolation` в Docker используется для указания уровня изоляции контейнера. Это особенно полезно в средах Windows, где доступны различные уровни изоляции.
Синтаксис команды выглядит следующим образом:
```bash
docker run --isolation=
```
Здесь `` - это тип изоляции, который вы хотите использовать, а `` - это образ Docker, который вы хотите запустить.
Возможные значения для `` включают:
- `default`: использует уровень изоляции по умолчанию, который определен в конфигурации Docker.
- `process`: каждый контейнер запускается в своем собственном пространстве имен, но он разделяет ядро с хостом. Это обеспечивает высокий уровень изоляции с минимальными накладными расходами.
- `hyperv`: каждый контейнер запускается в своей собственной виртуальной машине, обеспечивая максимальный уровень изоляции за счет некоторых дополнительных накладных расходов.
Пример использования:
```bash
docker run --isolation=hyperv ubuntu
```
В этом примере мы запускаем образ Ubuntu с уровнем изоляции `hyperv`. Это означает, что контейнер будет работать в своей собственной виртуальной машине, обеспечивая максимальный уровень изоляции.
## Команда `--add-host`
в Docker используется для добавления записи в файл `/etc/hosts` контейнера. Это может быть полезно, если вы хотите перенаправить трафик с одного домена на другой или на определенный IP-адрес, или если вам нужно протестировать связь с определенным хостом без изменения DNS.
## Синтаксис
Синтаксис команды следующий:
```bash
docker run --add-host=host:ip ...
```
где `host` - это имя хоста, которое вы хотите добавить, а `ip` - это IP-адрес, на который вы хотите перенаправить трафик.
## Пример
Допустим, вы хотите перенаправить все запросы к `my.test.com` на IP-адрес `127.0.0.1`. Вы можете сделать это, запустив контейнер с флагом `--add-host`:
```bash
docker run --add-host=my.test.com:127.0.0.1 ...
```
Теперь, когда ваше приложение внутри контейнера пытается подключиться к `my.test.com`, оно будет перенаправлено на `127.0.0.1`.
## Ограничения
Обратите внимание, что вы не можете использовать `--add-host` для переопределения встроенных DNS Docker, таких как `localhost`. Если вы попытаетесь это сделать, Docker вернет ошибку.
Также стоит отметить, что изменения, внесенные с помощью `--add-host`, применяются только к конкретному контейнеру, в котором они были выполнены. Если вы хотите, чтобы эти изменения применялись ко всем вашим контейнерам, вам нужно будет добавить `--add-host` к каждому из них отдельно.
## Команда `--target`
в Docker используется вместе с командой `docker build` для указания конкретной стадии сборки, которую следует собрать. Это полезно, если у вас есть многоэтапный Dockerfile и вы хотите собрать только определенную стадию.
Синтаксис команды выглядит следующим образом:
```bash
docker build --target -t .
```
где `` - это имя стадии, которую вы хотите собрать, а `` - это тег, который вы хотите присвоить этому изображению.
Например, если у вас есть Dockerfile, который выглядит так:
```Dockerfile
# syntax=docker/dockerfile:1
FROM alpine AS base
WORKDIR /app
COPY . .
FROM base AS dev
RUN apk add --no-cache python3
CMD ["python3", "-m", "http.server"]
FROM base AS prod
RUN apk add --no-cache nginx
CMD ["nginx", "-g", "daemon off;"]
```
Вы можете собрать только стадию `dev` следующим образом:
```bash
docker build --target dev -t myapp:dev .
```
Это создаст образ Docker с тегом `myapp:dev`, который будет содержать все слои до и включая стадию `dev`.
## Команда `--output`
в Docker используется для указания формата вывода информации. Это может быть полезно, когда вы хотите просмотреть определенные детали о ваших контейнерах или образах.
Синтаксис команды выглядит следующим образом:
```bash
docker --output="{{.Field}}"
```
Здесь `` - это команда Docker, которую вы хотите выполнить, а `Field` - это поле, информацию о котором вы хотите получить.
Например, если вы хотите просмотреть идентификаторы всех ваших образов Docker, вы можете использовать следующую команду:
```bash
docker images --output="{{.ID}}"
```
Эта команда вернет список идентификаторов всех ваших образов Docker.
Обратите внимание, что команда `--output` доступна только в Docker 1.13 и более поздних версиях. Если вы используете более старую версию Docker, вы можете использовать команду `--format` для достижения того же результата.
## Docker образы состоят из слоев (layers)
которые представляют собой набор изменений в файловой системе. Каждый слоев создается во время выполнения инструкции Dockerfile. При создании образа Docker, каждая инструкция Dockerfile создает новый слой в образе.
Слои Docker образа являются read-only, то есть они не могут быть изменены после создания. Однако, когда контейнер запускается из образа, Docker добавляет верхний слой, который является доступным для записи. Этот слой называется "слоем контейнера".
Опция `--squash` (экспериментальная) позволяет объединить все слои образа Docker в один. Это может быть полезно для уменьшения размера образа и упрощения его структуры.
Пример использования команды `--squash`:
```bash
docker build --squash -t my_image .
```
В этом примере, Docker сначала создаст образ как обычно, со всеми слоями, которые определены в Dockerfile. Затем, он объединит все эти слои в один, используя опцию `--squash`.
Обратите внимание, что опция `--squash` является экспериментальной и может не быть доступна в вашей версии Docker. Для включения экспериментальных функций в Docker, вам нужно установить переменную окружения `DOCKER_CLI_EXPERIMENTAL` в `enabled`.
```bash
export DOCKER_CLI_EXPERIMENTAL=enabled
```
После этого вы сможете использовать опцию `--squash` при сборке образов Docker.