本文目录导读:

- 使用 Docker Build 命令(最基础)
- 使用 Makefile
- 使用 Docker Compose
- 使用 CI/CD 工具
- 高级:使用 Docker Buildx(多架构构建)
- 使用自定义构建工具
- 最佳实践建议
- 使用自动化工具
使用 Docker Build 命令(最基础)
单个命令
docker build -t myapp:latest .
封装为脚本 build.sh
#!/bin/bash
# 一键构建脚本
IMAGE_NAME="myapp"
TAG=$(date +%Y%m%d-%H%M%S)
# 构建镜像
docker build \
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
--build-arg VERSION=${TAG} \
-t ${IMAGE_NAME}:${TAG} \
-t ${IMAGE_NAME}:latest \
-f Dockerfile \
.
# 推送镜像(可选)
# docker push ${IMAGE_NAME}:${TAG}
# docker push ${IMAGE_NAME}:latest
echo "镜像构建完成: ${IMAGE_NAME}:${TAG}"
使用 Makefile
# Makefile
IMAGE_NAME := myapp
VERSION := $(shell date +%Y%m%d-%H%M%S)
.PHONY: build push all
build:
docker build \
--build-arg VERSION=$(VERSION) \
-t $(IMAGE_NAME):$(VERSION) \
-t $(IMAGE_NAME):latest \
.
push:
docker push $(IMAGE_NAME):$(VERSION)
docker push $(IMAGE_NAME):latest
all: build push
# 一键构建
# make build
使用 Docker Compose
# docker-compose.yml
version: '3.8'
services:
webapp:
build:
context: .
dockerfile: Dockerfile
args:
BUILD_DATE: ${BUILD_DATE}
VERSION: ${VERSION}
image: myapp:${VERSION:-latest}
一键构建:
VERSION=$(date +%Y%m%d) docker-compose build
使用 CI/CD 工具
GitHub Actions
# .github/workflows/build.yml
name: Build Docker Image
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker Image
run: |
docker build \
--cache-from myapp:latest \
-t myapp:${{ github.sha }} \
-t myapp:latest \
.
GitLab CI
# .gitlab-ci.yml
build_image:
script:
- docker build -t myapp:$CI_COMMIT_SHORT_SHA -t myapp:latest .
only:
- main
高级:使用 Docker Buildx(多架构构建)
#!/bin/bash # buildx.sh - 多架构一键构建 # 创建构建器 docker buildx create --name mybuilder --use docker buildx inspect --bootstrap # 多架构构建 docker buildx build \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ --tag myapp:latest \ --push \ . # 或仅本地构建 docker buildx build \ --platform linux/amd64 \ --tag myapp:latest \ --load \ .
使用自定义构建工具
Shell 脚本 + 参数化
#!/bin/bash
# build-image.sh - 通用构建脚本
usage() {
echo "Usage: $0 [options]"
echo "Options:"
echo " -n, --name 镜像名称 (默认: myapp)"
echo " -t, --tag 镜像标签 (默认: latest)"
echo " -f, --file Dockerfile路径 (默认: Dockerfile)"
echo " -p, --push 构建后推送"
echo " --no-cache 不使用缓存"
}
# 解析参数
while [[ $# -gt 0 ]]; do
case $1 in
-n|--name) IMAGE_NAME="$2"; shift 2 ;;
-t|--tag) TAG="$2"; shift 2 ;;
-f|--file) DOCKERFILE="$2"; shift 2 ;;
-p|--push) PUSH=true; shift ;;
--no-cache) NO_CACHE="--no-cache"; shift ;;
*) usage; exit 1 ;;
esac
done
# 默认值
IMAGE_NAME=${IMAGE_NAME:-myapp}
TAG=${TAG:-latest}
DOCKERFILE=${DOCKERFILE:-Dockerfile}
# 构建命令
BUILD_CMD="docker build \
${NO_CACHE} \
-t ${IMAGE_NAME}:${TAG} \
-f ${DOCKERFILE} \
."
# 执行构建
echo "开始构建镜像: ${IMAGE_NAME}:${TAG}"
eval $BUILD_CMD
# 可选推送
if [ "$PUSH" = true ]; then
docker push ${IMAGE_NAME}:${TAG}
fi
echo "✅ 构建完成: ${IMAGE_NAME}:${TAG}"
最佳实践建议
Dockerfile 优化示例
# 多阶段构建 FROM node:16-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --from=builder /app/build /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
完整的构建流程
#!/bin/bash
# ci-build.sh - CI环境一键构建
set -e
# 1. 环境检查
echo "🔍 检查环境..."
command -v docker >/dev/null 2>&1 || { echo "需要安装Docker"; exit 1; }
# 2. 版本信息
VERSION=$(git describe --tags --always 2>/dev/null || echo "dev-$(date +%s)")
COMMIT=$(git rev-parse --short HEAD)
# 3. 构建参数
BUILD_ARGS=(
--build-arg VERSION=${VERSION}
--build-arg COMMIT=${COMMIT}
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
)
# 4. 构建镜像
echo "🏗️ 构建镜像..."
docker build \
"${BUILD_ARGS[@]}" \
--cache-from ${IMAGE_NAME}:latest \
-t ${IMAGE_NAME}:${VERSION} \
-t ${IMAGE_NAME}:${COMMIT} \
-t ${IMAGE_NAME}:latest \
.
# 5. 运行测试(可选)
echo "🧪 运行测试..."
docker run --rm ${IMAGE_NAME}:latest npm test
# 6. 推送镜像
echo "📤 推送镜像..."
docker push ${IMAGE_NAME}:${VERSION}
docker push ${IMAGE_NAME}:${COMMIT}
docker push ${IMAGE_NAME}:latest
echo "✅ CI构建完成!"
使用自动化工具
推荐的工具和管理平台
- Podman Build:无需守护进程的替代方案
- Kaniko:在Kubernetes中安全构建
- BuildKit:Docker的下一代构建引擎
- Jib:Java应用的无Docker构建
选择哪种方式取决于你的具体需求:
- 简单项目:使用
docker build + shell脚本 - 多环境:使用
Makefile - CI/CD集成:使用
GitHub Actions/GitLab CI - 多架构:使用
Docker Buildx - 生产环境:使用完整的CI/CD流程