介绍
在本实验中,你将学习如何利用 docker compose watch 命令实现 Docker 服务的自动重建与更新,以响应文件变更。我们将从搭建一个简单的 Docker Compose 项目开始,该项目包含构建上下文(build context)、基础应用文件、Dockerfile 以及 docker-compose.yaml 文件。
完成项目搭建后,你将探索 docker compose watch 的核心功能:监控文件修改并触发自动重建。我们还将研究 --no-up 选项(在不启动服务的情况下监听变更)和 --quiet 选项(抑制构建输出),使你能够更清晰地观察监听行为。
准备带构建上下文的简单 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 选项(隐藏构建输出),这些功能为开发工作流提供了更高效的解决方案。



