Как использовать команду docker compose build для сборки сервисов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь эффективно использовать команду docker compose build для сборки сервисов, определённых в файле Docker Compose. Вы начнёте с подготовки простого файла Docker Compose для определения многоконтейнерного приложения.

После настройки вы соберёте сервисы с помощью команды docker compose build. Затем вы изучите, как пересобирать сервисы после внесения изменений в соответствующие Dockerfiles. В завершение вы узнаете, как собирать сервисы с аргументами сборки (build arguments) и как использовать опцию --no-cache для чистой сборки.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555073{{"Как использовать команду docker compose build для сборки сервисов"}} docker/pull -.-> lab-555073{{"Как использовать команду docker compose build для сборки сервисов"}} docker/images -.-> lab-555073{{"Как использовать команду docker compose build для сборки сервисов"}} docker/build -.-> lab-555073{{"Как использовать команду docker compose build для сборки сервисов"}} end

Подготовка простого файла Docker Compose

На этом шаге вы узнаете, как создать базовый файл Docker Compose для определения и управления многоконтейнерными приложениями Docker. Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью Compose вы используете YAML-файл для настройки сервисов вашего приложения. Затем одной командой вы создаёте и запускаете все сервисы из вашей конфигурации.

Сначала установим Docker Compose. Поскольку он не предустановлен в среде LabEx, нам нужно загрузить бинарный файл.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Эта команда загружает бинарный файл Docker Compose с официальной страницы релизов GitHub и сохраняет его в /usr/local/bin/docker-compose. Части $(uname -s) и $(uname -m) автоматически определяют вашу операционную систему и архитектуру, чтобы загрузить правильный бинарный файл.

Далее нам нужно дать загруженному бинарному файлу права на выполнение.

sudo chmod +x /usr/local/bin/docker-compose

Эта команда делает команду docker-compose исполняемой.

Теперь проверим установку, посмотрев версию.

docker-compose --version

Вы должны увидеть вывод, похожий на Docker Compose version v2.20.2, что подтвердит корректную установку Docker Compose.

Теперь создадим простой файл Docker Compose. Мы определим сервис, использующий образ nginx.

Перейдите в директорию вашего проекта.

cd ~/project

Создайте новый файл docker-compose.yml с помощью редактора nano.

nano docker-compose.yml

Добавьте в файл следующее содержимое:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Разберём этот файл:

  • version: '3.8' указывает версию формата файла Docker Compose.
  • services: определяет различные сервисы, из которых состоит ваше приложение.
  • web: — это имя нашего сервиса. Вы можете выбрать любое имя.
  • image: nginx:latest указывает Docker-образ для этого сервиса. В данном случае мы используем последнюю версию официального образа Nginx.
  • ports: сопоставляет порты между хост-машиной и контейнером. "80:80" сопоставляет порт 80 на хосте с портом 80 в контейнере.

Сохраните файл, нажав Ctrl + X, затем Y и Enter.

Теперь загрузим образ nginx:latest, который мы указали в нашем файле docker-compose.yml. Хотя Docker Compose может автоматически загружать образы при выполнении docker-compose up, рекомендуется явно загружать их заранее, особенно в лабораторной среде, чтобы убедиться в их доступности.

docker pull nginx:latest

Эта команда загружает образ nginx:latest из Docker Hub. Вы увидите вывод, показывающий прогресс загрузки.

Сборка сервисов с помощью docker compose build

На предыдущем шаге мы создали простой файл docker-compose.yml, использующий готовый Docker-образ (nginx). Docker Compose также может собирать образы из Dockerfile. Это полезно, когда вам нужно кастомизировать образ или собрать образ для вашего собственного приложения.

На этом шаге мы модифицируем наш файл docker-compose.yml, чтобы собирать образ из Dockerfile вместо использования предсобранного образа.

Сначала создадим простой Dockerfile в директории ~/project.

nano ~/project/Dockerfile

Добавим следующее содержимое в Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker Compose!"]

Разберём этот Dockerfile:

  • FROM ubuntu:latest указывает базовый образ для нашего нового образа. Мы используем последнюю версию официального образа Ubuntu.
  • RUN apt-get update && apt-get install -y cowsay обновляет список пакетов и устанавливает пакет cowsay. Команда cowsay выводит сообщение в речевом пузыре, нарисованном коровой.
  • CMD ["cowsay", "Hello, Docker Compose!"] устанавливает команду по умолчанию, которая выполняется при запуске контейнера из этого образа.

Сохраните Dockerfile, нажав Ctrl + X, затем Y и Enter.

Теперь модифицируем наш файл docker-compose.yml для использования этого Dockerfile. Откроем файл для редактирования:

nano ~/project/docker-compose.yml

Изменим содержимое на следующее:

version: "3.8"
services:
  cow:
    build: .

В обновлённом docker-compose.yml:

  • Мы изменили имя сервиса с web на cow, чтобы лучше отразить его назначение.
  • Мы заменили директиву image: на build: .. Директива build: . указывает Docker Compose собрать образ для этого сервиса, используя Dockerfile в текущей директории (.).

Сохраните файл docker-compose.yml, нажав Ctrl + X, затем Y и Enter.

Теперь мы можем использовать команду docker-compose build для сборки образа сервиса cow. Убедитесь, что вы находитесь в директории ~/project.

cd ~/project
docker-compose build

Эта команда прочитает файл docker-compose.yml, найдёт сервис cow и соберёт образ на основе Dockerfile в текущей директории. Вы увидите вывод, показывающий этапы процесса сборки, включая загрузку базового образа Ubuntu, обновление пакетов и установку cowsay.

После завершения сборки вы можете проверить создание образа, выведя список локальных Docker-образов.

docker images

Вы должны увидеть образ с именем вида project_cow (Docker Compose автоматически именует образы на основе имени директории и имени сервиса) и тегом вида latest.

Пересборка сервисов после изменения Dockerfile

На предыдущем шаге мы собрали Docker-образ с помощью Dockerfile и команды docker-compose build. Что произойдёт, если мы внесём изменения в Dockerfile? Docker использует механизм кэширования для ускорения процесса сборки. Если слой в Dockerfile не изменился, Docker использует кэшированную версию вместо повторной сборки. Однако если изменяется слой или последующие слои, Docker пересоберёт эти слои.

На этом шаге мы изменим наш Dockerfile и затем пересоберём образ, чтобы увидеть, как Docker обрабатывает изменения.

Сначала изменим Dockerfile, чтобы поменять сообщение, выводимое cowsay. Откроем Dockerfile для редактирования:

nano ~/project/Dockerfile

Изменим строку CMD на следующую:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello again, Docker Compose!"]

Мы изменили сообщение с "Hello, Docker Compose!" на "Hello again, Docker Compose!".

Сохраните Dockerfile, нажав Ctrl + X, затем Y и Enter.

Теперь пересоберём образ, снова используя команду docker-compose build. Убедитесь, что вы находитесь в директории ~/project.

cd ~/project
docker-compose build

Наблюдайте за выводом процесса сборки. Вы заметите, что первые два шага (FROM ubuntu:latest и RUN apt-get update && apt-get install -y cowsay) скорее всего используют кэшированные слои из предыдущей сборки. Однако последний шаг (CMD ["cowsay", "Hello again, Docker Compose!"]) будет пересобран, так как мы изменили эту строку в Dockerfile.

После завершения сборки вы можете проверить обновление образа, выведя список локальных Docker-образов.

docker images

Образ project_cow теперь должен отражать изменения, внесённые в Dockerfile. Хотя ID образа может измениться, имя и тег останутся прежними.

Для дополнительного подтверждения изменений мы можем запустить контейнер из этого нового образа и увидеть вывод.

docker run project_cow

Вы должны увидеть вывод cowsay с обновлённым сообщением: "Hello again, Docker Compose!".

Сборка сервисов с аргументами сборки и без кэша

На этом шаге мы рассмотрим две продвинутые опции сборки в Docker Compose: использование аргументов сборки и сборку без кэша.

Аргументы сборки позволяют передавать переменные в процесс сборки Docker. Это полезно для кастомизации сборки под разные окружения или конфигурации без изменения самого Dockerfile.

Сначала модифицируем наш Dockerfile для приёма аргумента сборки. Откроем Dockerfile для редактирования:

nano ~/project/Dockerfile

Изменим содержимое на следующее:

FROM ubuntu:latest
ARG MESSAGE="Hello from build argument!"
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "$MESSAGE"]

Мы добавили инструкцию ARG MESSAGE для определения аргумента сборки с именем MESSAGE и значением по умолчанию. Также изменили инструкцию CMD для использования этого аргумента.

Сохраните Dockerfile, нажав Ctrl + X, затем Y и Enter.

Теперь модифицируем файл docker-compose.yml для передачи значения этому аргументу сборки. Откроем файл для редактирования:

nano ~/project/docker-compose.yml

Изменим содержимое на следующее:

version: "3.8"
services:
  cow:
    build:
      context: .
      args:
        MESSAGE: "Custom message from Compose!"

Мы изменили директиву build: на объект с полями context: и args:.

  • context: . указывает контекст сборки - директорию, содержащую Dockerfile
  • args: содержит аргументы сборки для передачи в Dockerfile. Мы передаём значение "Custom message from Compose!" аргументу MESSAGE

Сохраните файл docker-compose.yml, нажав Ctrl + X, затем Y и Enter.

Теперь соберём образ с аргументом сборки. Убедитесь, что вы находитесь в директории ~/project.

cd ~/project
docker-compose build

Наблюдайте за выводом сборки. Вы должны увидеть, что аргумент сборки используется в процессе.

После завершения сборки запустим контейнер из этого образа, чтобы увидеть вывод.

docker run project_cow

Вы должны увидеть вывод cowsay с сообщением "Custom message from Compose!". Это подтверждает успешную передачу и использование аргумента сборки.

Иногда может потребоваться принудительная пересборка всех слоёв без использования кэша. Это полезно при подозрении на проблемы с кэшем или для гарантии чистой сборки. Для этого используется флаг --no-cache с командой docker-compose build.

Попробуем пересобрать образ с флагом --no-cache.

docker-compose build --no-cache

Снова наблюдайте за выводом сборки. На этот раз Docker не будет использовать кэшированные слои и пересоберёт каждый шаг в Dockerfile. Этот процесс займёт больше времени, чем сборка с кэшем.

После завершения сборки можно снова запустить контейнер для подтверждения, что сообщение осталось переданным через аргумент сборки.

docker run project_cow

Вы по-прежнему должны увидеть "Custom message from Compose!". Флаг --no-cache влияет только на процесс сборки, а не на конфигурацию, определённую в docker-compose.yml.

Итоги

В этой лабораторной работе вы научились подготавливать простой файл Docker Compose, установив Docker Compose и создав файл docker-compose.yml для определения сервиса с использованием образа nginx. Затем вы попрактиковались в сборке сервисов с помощью команды docker compose build, включая пересборку сервисов после изменения Dockerfile, а также сборку сервисов с аргументами сборки и без использования кэша.