Введение
В этой лабораторной работе вы научитесь использовать команду docker compose watch для автоматической пересборки и обновления ваших Docker-сервисов при изменении файлов. Мы начнем с настройки простого проекта Docker Compose с контекстом сборки, включающего базовый файл приложения, Dockerfile и файл docker-compose.yaml.
После настройки проекта вы изучите основную функциональность docker compose watch для отслеживания изменений файлов и автоматического запуска пересборки. Мы также рассмотрим опцию --no-up для наблюдения за изменениями без первоначального запуска сервисов и опцию --quiet для подавления вывода сборки, что позволит более четко наблюдать за поведением watch.
Подготовка простого проекта 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 для подавления вывода сборки, что обеспечивает более удобный рабочий процесс при разработке.



