如何使用 docker compose watch 命令实现服务自动重建

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何利用 docker compose watch 命令实现 Docker 服务的自动重建与更新,以响应文件变更。我们将从搭建一个简单的 Docker Compose 项目开始,该项目包含构建上下文(build context)、基础应用文件、Dockerfile 以及 docker-compose.yaml 文件。

完成项目搭建后,你将探索 docker compose watch 的核心功能:监控文件修改并触发自动重建。我们还将研究 --no-up 选项(在不启动服务的情况下监听变更)和 --quiet 选项(抑制构建输出),使你能够更清晰地观察监听行为。


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 项目。构建上下文是指发送给 Docker 守护进程用于构建镜像的指定位置(PATH 或 URL)下的文件集合。这非常重要,因为 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,该文件会将 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 目录,并配置容器启动时运行该 Python 脚本。

最后创建 docker-compose.yaml 文件来定义服务,该文件会告知 Docker Compose 如何构建和运行应用:

nano docker-compose.yaml

docker-compose.yaml 中添加以下内容:

version: "3.8"

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

该文件定义了一个名为 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 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 如何在代码变更时自动处理构建和重启流程。

在运行 docker compose watch 的终端中按 Ctrl+C 可停止该进程。

探索 --no-up 选项:仅监控不执行初始构建

在本步骤中,我们将探索 docker compose watch--no-up 选项。默认情况下,docker compose watch 会在开始监控文件变更前先构建并启动 docker-compose.yaml 中定义的服务。而 --no-up 选项可以跳过初始构建和启动阶段,这在你想先监控变更而不立即启动服务时非常有用,比如计划稍后手动启动或服务已在运行的情况。

确保当前位于 ~/project/my-watch-app 目录:

cd ~/project/my-watch-app

现在使用 --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)。

返回运行监控命令的终端,你将看到检测到变更并重建镜像的输出。但由于使用了 --no-up 选项,容器不会自动重启。

要查看变更效果,你需要在镜像重建完成后手动启动服务:

docker-compose up

此时容器将输出新消息 "Watching without initial up!"。

在运行 docker compose watch --no-up 的终端按 Ctrl+C 可停止监控进程,在运行 docker-compose up 的终端按 Ctrl+C 可停止容器。

观察 --quiet 选项:隐藏构建输出

在本步骤中,我们将观察 docker compose watch--quiet 选项效果。默认情况下,当 docker compose watch 检测到变更并重建镜像时,会显示完整的构建过程输出。而 --quiet 选项会抑制这些详细构建信息,仅显示监控进程和服务重启的关键信息,这在频繁进行小改动时能让输出更加简洁。

确保当前位于 ~/project/my-watch-app 目录:

cd ~/project/my-watch-app

现在使用 --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 构建过程的详细步骤会被隐藏,仅显示简洁的重建信息。

这演示了 --quiet 选项如何减少 docker compose watch 触发构建阶段时的输出冗余。

在运行 docker compose watch --quiet --no-up 的终端按 Ctrl+C 可停止监控进程。

总结

在本实验中,我们学习了如何准备一个包含构建上下文(build context)的简单 Docker Compose 项目,这对于从本地文件构建 Docker 镜像至关重要。我们创建了项目目录、基础 Python 应用文件(app.py)、用于构建应用镜像的 Dockerfile,以及定义服务及其构建上下文的 docker-compose.yaml 文件。

随后我们探索了 docker compose watch 命令,该命令能自动监控构建上下文中的文件变更并触发关联服务的重建。我们通过该命令观察了自动重建过程,并实践了 --no-up 选项(跳过初始构建)和 --quiet 选项(隐藏构建输出),这些功能为开发工作流提供了更高效的解决方案。