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

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

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

Введение

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

После настройки проекта вы изучите основную функциональность docker compose watch для отслеживания изменений файлов и автоматического запуска пересборки. Мы также рассмотрим опцию --no-up для наблюдения за изменениями без первоначального запуска сервисов и опцию --quiet для подавления вывода сборки, что позволит более четко наблюдать за поведением watch.


Skills Graph

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

Подготовка простого проекта Docker Compose с контекстом сборки

На этом шаге мы подготовим простой проект Docker Compose, включающий контекст сборки. Контекст сборки — это набор файлов в указанном расположении (PATH или URL), которые передаются демону Docker для построения образа. Это важно, потому что Dockerfile и все необходимые ему файлы (например, код приложения) должны находиться в контексте сборки.

Сначала создадим директорию для нашего проекта. Назовём её my-watch-app.

mkdir ~/project/my-watch-app
cd ~/project/my-watch-app

Теперь создадим простой файл приложения. Используем базовый скрипт на Python, который выводит сообщение.

nano app.py

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

print("Hello from the Docker container!")

Сохраним и закроем файл (Ctrl+X, Y, Enter).

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

nano Dockerfile

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

FROM python:3.9-slim

WORKDIR /app

COPY app.py .

CMD ["python", "app.py"]

Этот Dockerfile использует облегчённый образ Python 3.9 в качестве основы, устанавливает рабочую директорию /app, копирует app.py в директорию /app и задаёт команду для запуска скрипта при старте контейнера.

Наконец, создадим файл docker-compose.yaml для определения нашего сервиса. Этот файл укажет Docker Compose, как собрать и запустить наше приложение.

nano docker-compose.yaml

Добавим следующее содержимое в docker-compose.yaml:

version: "3.8"

services:
  myapp:
    build: .
    volumes:
      - .:/app

Этот файл docker-compose.yaml определяет сервис с именем myapp. Инструкция build: . указывает Docker Compose собрать образ, используя Dockerfile в текущей директории (наш контекст сборки). Строка volumes: - .:/app монтирует текущую директорию (.) на хосте в директорию /app внутри контейнера. Это важно для docker compose watch, так как позволяет изменениям на хосте отражаться в контейнере.

Теперь соберём и запустим наш сервис с помощью Docker Compose, чтобы убедиться, что всё настроено правильно. Поскольку Docker Compose не установлен заранее, сначала установим его.

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
sudo chmod +x /usr/local/bin/docker-compose

Теперь можем использовать docker-compose.

docker-compose up --build

Вы должны увидеть вывод, указывающий на сборку образа и запуск контейнера с сообщением "Hello from the Docker container!". Нажмите Ctrl+C, чтобы остановить контейнер.

Использование docker compose watch для отслеживания изменений файлов и пересборки

На этом шаге мы будем использовать команду docker compose watch для автоматической пересборки и перезапуска нашего сервиса при внесении изменений в код приложения. Это мощная функция для рабочих процессов разработки, позволяющая быстро вносить изменения.

Команда docker compose watch отслеживает файлы в вашем контексте сборки и при обнаружении изменений может автоматически пересобрать образ и перезапустить сервис.

Убедитесь, что вы находитесь в директории ~/project/my-watch-app.

cd ~/project/my-watch-app

Теперь выполните команду docker compose watch.

docker-compose watch

Вы увидите вывод, указывающий, что Docker Compose запускает сервис и отслеживает изменения файлов. Первоначальный вывод будет аналогичен выполнению docker-compose up.

Пока docker compose watch работает в вашем терминале, откройте другой терминал или вкладку. Перейдите в директорию проекта в новом терминале.

cd ~/project/my-watch-app

Теперь изменим файл app.py.

nano app.py

Измените содержимое на:

print("Hello again from the updated Docker container!")

Сохраните и закройте файл (Ctrl+X, Y, Enter).

Вернитесь в терминал, где выполняется docker compose watch. Вы должны увидеть вывод, указывающий, что изменение было обнаружено, образ пересобирается, а контейнер перезапускается. После перезапуска будет выведено новое сообщение "Hello again from the updated Docker container!".

Это демонстрирует, как docker compose watch автоматически обрабатывает процесс сборки и перезапуска при изменении вашего кода.

Нажмите Ctrl+C в терминале, где выполняется docker compose watch, чтобы остановить процесс.

Изучение опции --no-up для наблюдения без первоначальной сборки

На этом шаге мы рассмотрим использование опции --no-up с командой docker compose watch. По умолчанию docker compose watch сначала собирает и запускает сервисы, определённые в вашем файле docker-compose.yaml, перед началом наблюдения за изменениями файлов. Опция --no-up отключает эту первоначальную сборку и запуск. Это полезно, если вы хотите начать наблюдение за изменениями без немедленного запуска сервисов, например, если планируете запустить их вручную позже или они уже работают.

Убедитесь, что вы находитесь в директории ~/project/my-watch-app.

cd ~/project/my-watch-app

Теперь выполните команду docker compose watch с опцией --no-up.

docker-compose watch --no-up

Вы заметите, что вывод отличается от предыдущего шага. Docker Compose начнёт наблюдать за изменениями файлов, но не будет собирать образ или запускать контейнер изначально. В выводе будет указано, что ведётся наблюдение за указанными путями.

Пока docker compose watch --no-up выполняется в вашем терминале, откройте другой терминал или вкладку. Перейдите в директорию проекта в новом терминале.

cd ~/project/my-watch-app

Теперь снова изменим файл app.py.

nano app.py

Измените содержимое на:

print("Watching without initial up!")

Сохраните и закройте файл (Ctrl+X, Y, Enter).

Вернитесь в терминал, где выполняется docker compose watch --no-up. Вы должны увидеть вывод, указывающий, что изменение было обнаружено и образ пересобирается. Однако контейнер не перезапустится автоматически, так как мы использовали опцию --no-up.

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

docker-compose up

Вы увидите новое сообщение "Watching without initial up!", выведенное контейнером.

Нажмите Ctrl+C в терминале, где выполняется docker compose watch --no-up, чтобы остановить процесс наблюдения. Нажмите Ctrl+C в терминале, где выполняется docker-compose up, чтобы остановить контейнер.

Наблюдение за работой опции --quiet для скрытия вывода сборки

На этом шаге мы рассмотрим действие опции --quiet в команде docker compose watch. По умолчанию, когда docker compose watch обнаруживает изменения и пересобирает образ, он отображает полный вывод процесса сборки. Опция --quiet подавляет этот подробный вывод, показывая только основную информацию о процессе наблюдения и перезапуске сервисов. Это делает вывод более чистым, особенно при частых небольших изменениях.

Убедитесь, что вы находитесь в директории ~/project/my-watch-app.

cd ~/project/my-watch-app

Теперь выполните команду docker compose watch с опцией --quiet. Мы также снова включим опцию --no-up, чтобы видеть только вывод, связанный с процессом наблюдения и пересборки, а не с первоначальным запуском сервиса.

docker-compose watch --quiet --no-up

Вы увидите вывод, указывающий, что Docker Compose наблюдает за изменениями файлов, но изначально не будет подробного вывода сборки.

Пока docker compose watch --quiet --no-up выполняется в вашем терминале, откройте другой терминал или вкладку. Перейдите в директорию проекта в новом терминале.

cd ~/project/my-watch-app

Теперь внесём последнее изменение в файл app.py.

nano app.py

Измените содержимое на:

print("Quietly watching changes!")

Сохраните и закройте файл (Ctrl+X, Y, Enter).

Вернитесь в терминал, где выполняется docker compose watch --quiet --no-up. Вы должны увидеть вывод, указывающий, что изменение было обнаружено и образ пересобирается, но подробные шаги процесса сборки Docker будут скрыты. Вы увидите только краткое сообщение о пересборке.

Это демонстрирует, как опция --quiet уменьшает подробность вывода во время фазы сборки, запускаемой docker compose watch.

Нажмите Ctrl+C в терминале, где выполняется docker compose watch --quiet --no-up, чтобы остановить процесс наблюдения.

Итоги

В этой лабораторной работе мы научились подготавливать простой проект Docker Compose с контекстом сборки, что необходимо для создания Docker-образов из локальных файлов. Мы создали директорию проекта, базовый файл Python-приложения (app.py), Dockerfile для сборки образа приложения и файл docker-compose.yaml для определения сервиса и его контекста сборки.

Затем мы изучили команду docker compose watch, которая позволяет автоматически отслеживать изменения файлов в контексте сборки и запускать пересборку связанного сервиса. Мы научились использовать эту команду для наблюдения за процессом автоматической пересборки, а также рассмотрели опцию --no-up для наблюдения без первоначальной сборки и опцию --quiet для подавления вывода сборки, что обеспечивает более удобный рабочий процесс при разработке.