Docker Compose 命令实现动态构建和部署
一、编写支持动态版本号的 docker-compose.yml
version: '3.8'services:myapp:build: context: . # Dockerfile所在目录args:APP_VERSION: ${TAG:-latest} # 从环境变量获取版本号,默认latestimage: myapp:${TAG:-latest} # 镜像名称+动态标签ports:- "8080:80"environment:- VERSION=${TAG}
关键配置说明:
-
版本注入机制
通过${TAG}
环境变量动态控制镜像版本,可在.env
文件或命令行中定义该变量。 -
构建参数传递
build.args
将版本号传递到 Dockerfile 的构建阶段(需在 Dockerfile 中声明ARG APP_VERSION
)。 -
镜像标签策略
image: myapp:${TAG}
使得每次构建生成带有唯一标签的镜像,避免覆盖旧版本。
二、执行动态构建与部署的命令流程
1. 配置版本号
在项目根目录创建 .env
文件(或通过命令行注入):
# .env 示例
TAG=v2.1.0
2. 构建并启动容器
# 强制重建镜像(即使Dockerfile未修改)
docker-compose up --build --force-recreate -d
3. 验证版本更新
# 查看镜像标签
docker images | grep myapp# 查看容器环境变量中的版本
docker exec <container_id> env | grep VERSION
三、进阶版本管理技巧
1. 多环境版本控制
通过不同环境文件切换版本:
# 开发环境
docker-compose -f docker-compose.yml --env-file .env.dev up# 生产环境
docker-compose -f docker-compose.yml --env-file .env.prod up
2. 并行构建加速
对于多服务场景,启用并行构建:
docker-compose build --parallel # 利用多核CPU加速构建
3. 版本回滚操作
# 修改.env中的TAG为旧版本号后执行
docker-compose up -d --no-build # 直接使用旧镜像启动
四、配套 Dockerfile 示例
FROM nginx:alpineARG APP_VERSION # 接收构建参数
ENV VERSION=$APP_VERSION # 将版本注入容器环境COPY ./dist /usr/share/nginx/html
# 其他构建步骤...
五、注意事项
-
清理旧镜像
定期运行docker image prune -a
清理无标签镜像,避免存储膨胀。 -
版本变量穿透
若需在容器内使用版本号,需同时在environment
和build.args
中声明。 -
Compose 文件兼容性
version: '3.8'
支持最新的 Docker API 特性,建议与 Docker Engine 版本匹配。
通过以上方案,每次修改 .env
中的 TAG
变量后执行 docker-compose up --build
,即可自动生成新版本镜像并部署容器。此方法适用于 CI/CD 流水线中的版本化部署场景。