怎样实现一键构建容器镜像

wen 实用脚本 28

本文目录导读:

怎样实现一键构建容器镜像

  1. 使用 Docker Build 命令(最基础)
  2. 使用 Makefile
  3. 使用 Docker Compose
  4. 使用 CI/CD 工具
  5. 高级:使用 Docker Buildx(多架构构建)
  6. 使用自定义构建工具
  7. 最佳实践建议
  8. 使用自动化工具

使用 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流程

抱歉,评论功能暂时关闭!