本文目录导读:

- 使用 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流程
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播