
Docker Build
- 10 installs
- 2 repo stars
- Updated July 29, 2026
- full-statck-skills/docker-skills
Covers the docker build command and image lifecycle: build args, tagging, inspection, pushing to registries, and pruning.
About
Provides reference for docker build and image lifecycle management including build args, tagging, inspection, pushing, and pruning. A developer uses it to build and manage Docker images.
- --build-arg usage and tagging strategies
- Image inspection, push, and prune commands
Docker Build by the numbers
- 10 all-time installs (skills.sh)
- Ranked #1,007 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
- Data as of Jul 30, 2026 (Skillselion catalog sync)
npx skills add https://github.com/full-statck-skills/docker-skills --skill docker-buildAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 10 |
|---|---|
| repo stars | ★ 2 |
| Last updated | July 29, 2026 |
| Repository | full-statck-skills/docker-skills ↗ |
What it does
Covers the docker build command and image lifecycle: build args, tagging, inspection, pushing to registries, and pruning.
Files
Docker Build — 镜像构建与管理
Complete reference for docker build and image lifecycle management. Build, tag, inspect, push, prune.
When to Use
ALWAYS use this skill when the user mentions:
- "docker build", "怎么构建镜像", "docker build 命令"
- "docker tag", "docker push", "推送镜像"
- "docker images", "镜像管理", "docker image"
- "--build-arg", "构建参数"
- "docker history", "docker inspect", "镜像查看"
- "docker image prune", "docker system prune", "清理镜像"
| ✅ Use When | ❌ Use Instead |
|---|---|
| Running docker build, tagging, pushing | |
| Managing local images | |
Needing docker build CLI reference | |
| Writing the Dockerfile itself | docker-dockerfile |
| Multi-platform builds | docker-buildx |
| BuildKit advanced features | docker-buildx |
docker build — Complete Syntax
docker build [OPTIONS] PATH | URL | -Essential Options
# Basic build
docker build -t myapp:v1 .
# Tag multiple tags at once
docker build -t myapp:v1.2.3 -t myapp:latest -t ghcr.io/org/myapp:v1.2.3 .
# Build from specific Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .
# Build from Git repository
docker build -t myapp https://github.com/user/repo.git#main
# Build from stdin
cat Dockerfile | docker build -t myapp -
docker build -t myapp - <<EOF
FROM alpine:3.20
CMD ["echo", "hello"]
EOFBuild Arguments (--build-arg)
# Pass build arguments
docker build --build-arg NODE_VERSION=22 --build-arg ENV=production -t myapp .
# From file
docker build --build-arg $(cat .env.build | xargs) -t myapp .ARG NODE_VERSION=20
FROM node:${NODE_VERSION}-alpine
ARG ENV=development
ENV NODE_ENV=${ENV}
RUN echo "Building for ${NODE_ENV}"| Option | Purpose |
|---|---|
--build-arg KEY=VALUE | Pass single argument |
--build-arg-file FILE | Read args from file |
ARG KEY=default | Define in Dockerfile with default |
Build Control
# No cache (force full rebuild)
docker build --no-cache -t myapp .
# Pull base image even if cached locally
docker build --pull -t myapp .
# Quiet mode (only image ID)
docker build -q -t myapp .
# Set build target (multi-stage)
docker build --target builder -t myapp:builder .
# BuildKit output (export to local directory)
docker build --output type=local,dest=./out .
# Platform (with BuildKit)
docker build --platform linux/amd64 -t myapp .
# Add metadata
docker build --label "org.opencontainers.image.version=v1.2.3" -t myapp .Build Context
# Current directory
docker build -t myapp .
# Specific directory
docker build -t myapp ./app
# Remote Git repo
docker build -t myapp https://github.com/user/repo.git#v1.0.0:subdir
# Pipe context via stdin (no context)
docker build -t myapp - < DockerfileImage Tagging — docker tag
# Tag an existing image
docker tag myapp:v1 myapp:latest
docker tag myapp:v1 ghcr.io/org/myapp:v1
# Tag with registry
docker tag myapp:v1 registry.example.com:5000/myapp:v1
# Force overwrite existing tag
docker tag myapp:v1 myapp:latest # replaces where :latest pointsTag Naming Convention
[registry[:port]/][namespace/]name[:tag|@digest]
ghcr.io/myorg/myapp:v1.2.3
│ │ │ │
│ │ │ └── tag (semver)
│ │ └── image name
│ └── namespace
└── registryImage Inspection
# List images
docker images
docker image ls
docker image ls --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# Inspect image details
docker inspect myapp:v1
docker inspect --format='{{.Config.Env}}' myapp:v1
docker inspect --format='{{.Created}}' myapp:v1
# View layer history
docker history myapp:v1
docker history --no-trunc --human myapp:v1
# Show digest
docker image ls --digests myapp
docker inspect --format='{{index .RepoDigests 0}}' myapp:v1Pushing to Registry
# Login
docker login
docker login ghcr.io -u USERNAME -p $TOKEN
# Push
docker push myapp:v1
docker push myapp --all-tags
# Push with digest
docker push myapp@sha256:abc123...Image Cleanup
# Remove specific image
docker rmi myapp:v1
docker image rm myapp:v1
# Remove dangling images (<none>:<none>)
docker image prune
# Remove all unused images
docker image prune -a
# Full system cleanup
docker system prune -a --volumes
# Check disk usage
docker system df
docker system df -vWorkflow — 推荐构建流程
Step 1: 准备 Dockerfile: 已完成编写(或使用 docker-dockerfile 生成) Step 2: 配置构建参数: 确认 --build-arg、--label、--target Step 3: 执行构建: docker build -t myapp:v1 -t myapp:latest . Step 4: 验证镜像: docker images / docker history / docker inspect Step 5: 推送仓库: docker push 前 docker login,生产环境用 digest 固定
Gotchas — Common Pitfalls
- `docker build -t myapp .` sends entire context: Without
.dockerignore, sends node_modules/.git and everything. Use.dockerignoreto minimize context. - `docker build --no-cache` is slow: Only use when truly needed. Normal builds reuse cached layers.
- `docker tag` is mutable: Tags can be moved. For production, use digest (
@sha256:...) instead of tag. - `docker push` without login fails silently: Always
docker loginfirst, or use CI credential helpers. - `docker system prune -a` is destructive: Removes ALL unused images, containers, networks. Don't run in production without confirmation.
- `docker build --pull` changes base image: Your build may produce different output if base image was updated.
Boundary — 能力边界(适用与不适用场景)
| 分类 | 场景 | 说明 |
|---|---|---|
| ✅ 能做 | docker build 构建镜像 | 完整命令语法、上下文管理、多 tag |
| ✅ 能做 | docker tag 打标签 | 命名规范、多 registry 标签 |
| ✅ 能做 | docker push 推送镜像 | 仓库登录、digest 固定 |
| ✅ 能做 | 镜像管理(inspect/history/prune) | 本地镜像生命周期 |
| ⚠️ 需条件 | BuildKit 高级特性(secret/cache/ssh) | 使用 docker-buildx |
| ⚠️ 需条件 | 网络不稳定时推送大镜像 | 配置 max-concurrent-uploads |
| ❌ 超范围 | Dockerfile 编写 | 使用 docker-dockerfile |
| ❌ 超范围 | 多平台构建(arm64/amd64) | 使用 docker-buildx |
| ❌ 超范围 | CI/CD 流水线集成 | 使用 docker-cicd |
When NOT to Use This Skill
| ❌ Skip | ✅ Use Instead |
|---|---|
| Writing the Dockerfile itself | docker-dockerfile |
| Multi-platform/arm64 builds | docker-buildx |
| BuildKit secrets/cache/SSH | docker-buildx |
| Running containers | docker-run |
| Docker basics | docker-basics |
Security & Stability
- Always scan built images with
docker scoutbefore pushing to production registry. - Use
docker build --pullto ensure base images are up-to-date with security patches. - Never embed secrets in build args (
--build-argis visible in image history). Use BuildKit--secretinstead. - Tag images with
--labelfor metadata (version, git SHA, build timestamp) for audit trails. - Remove unused images regularly with
docker image pruneto free disk space and reduce attack surface.
📚 官方文档参考
| 文档 | 地址 |
|---|---|
| Docker Build | https://docs.docker.com/build/ |
| docker build 命令 | https://docs.docker.com/reference/cli/docker/build/ |
| docker tag | https://docs.docker.com/reference/cli/docker/image/tag/ |
| docker push | https://docs.docker.com/reference/cli/docker/image/push/ |
| docker image | https://docs.docker.com/reference/cli/docker/image/ |
| Dockerfile 参考 | https://docs.docker.com/reference/dockerfile/ |
🧭 Docker Skills Journey
📍 You are here: `docker-build` — 镜像构建与管理
basics → dockerfile → build → buildx → run → compose → ...→ Next: docker-buildx — Multi-platform builds and BuildKit advanced features
从零构建并推送镜像
# 1. 创建项目
mkdir myapp && cd myapp
# 2. 写 Dockerfile
cat > Dockerfile <<'EOF'
FROM nginx:1.27-alpine
COPY index.html /usr/share/nginx/html/
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost/health || exit 1
EOF
echo '<h1>Hello Docker Build</h1>' > index.html
# 3. 构建(多 tag)
docker build -t myapp:v1.0.0 -t myapp:latest .
# 4. 查看
docker images myapp
docker history myapp:v1.0.0
docker inspect --format='{{.Config.Env}}' myapp:v1.0.0
# 5. 运行验证
docker run -d -p 8080:80 --name myapp-test myapp:latest
curl localhost:8080
docker stop myapp-test && docker rm myapp-test
# 6. 推送到仓库
docker login
docker tag myapp:v1.0.0 docker.io/myuser/myapp:v1.0.0
docker push docker.io/myuser/myapp:v1.0.0
docker push docker.io/myuser/myapp:latest
构建参数与环境区分
Dockerfile
ARG NODE_VERSION=22
FROM node:${NODE_VERSION}-alpine
ARG APP_ENV=development
ENV NODE_ENV=${APP_ENV}
WORKDIR /app
COPY package*.json ./
# dev 装全部依赖,prod 仅生产依赖
RUN if [ "$APP_ENV" = "production" ]; then npm ci --production; else npm install; fi
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]构建命令
# 开发构建
docker build \
--build-arg NODE_VERSION=22 \
--build-arg APP_ENV=development \
-t myapp:dev .
# 生产构建
docker build \
--build-arg NODE_VERSION=22 \
--build-arg APP_ENV=production \
-t myapp:prod .
# CI 中使用 Git SHA 作为标签
docker build \
--build-arg APP_ENV=production \
--label "org.opencontainers.image.version=$(git rev-parse --short HEAD)" \
-t myapp:$(git rev-parse --short HEAD) .查看构建参数是否生效
docker inspect --format='{{.Config.Env}}' myapp:prod | grep NODE_ENV
# [NODE_ENV=production]
docker inspect --format='{{json .Config.Labels}}' myapp:prod | jq .
# {"org.opencontainers.image.version": "abc1234"}
多阶段构建目标选择
Dockerfile
FROM golang:1.23-alpine AS builder
WORKDIR /src
COPY . .
RUN go build -o /app .
FROM golang:1.23-alpine AS tester
WORKDIR /src
COPY . .
RUN go test ./...
FROM alpine:3.20 AS runtime
COPY --from=builder /app /usr/local/bin/app
CMD ["app"]按目标构建
# 仅构建测试阶段(不产生最终镜像)
docker build --target tester -t myapp:test .
# 构建运行阶段
docker build --target runtime -t myapp:latest .
# 构建全部阶段(默认)
docker build -t myapp:latest .场景
| 场景 | 命令 |
|---|---|
| CI 仅跑测试 | docker build --target tester . |
| 构建生产镜像 | docker build --target runtime -t myapp:prod . |
| 调试编译阶段 | docker build --target builder -t myapp:debug . && docker run -it myapp:debug sh |
docker build 参数速查
完整参数表
| 参数 | 说明 | 示例 |
|---|---|---|
-t, --tag | 镜像名称:标签 | -t myapp:v1 |
-f, --file | 指定 Dockerfile | -f Dockerfile.prod |
--build-arg | 构建参数 | --build-arg NODE_ENV=prod |
--build-arg-file | 从文件读取构建参数 | --build-arg-file .env.build |
--no-cache | 不使用构建缓存 | --no-cache |
--pull | 强制拉取基础镜像 | --pull |
--target | 多阶段构建目标 | --target builder |
--platform | 目标平台(需 BuildKit) | --platform linux/amd64 |
--output | BuildKit 输出格式 | --output type=local,dest=./out |
--label | 镜像元数据 | --label version=v1.2.3 |
--add-host | 添加 hosts 条目 | --add-host api:192.168.1.100 |
--network | 构建时网络模式 | --network host |
-q, --quiet | 安静模式(仅输出 ID) | -q |
--secret | BuildKit 密钥挂载 | --secret id=npmrc,src=.npmrc |
--ssh | BuildKit SSH 转发 | --ssh default |
--cache-from | 外部缓存源 | --cache-from myapp:latest |
--progress | 输出样式 | --progress plain |
--ulimit | ulimit 设置 | --ulimit nofile=1024:1024 |
镜像管理命令速查
| 命令 | 说明 |
|---|---|
docker build -t name:tag . | 构建镜像 |
docker tag src:tag dst:tag | 打标签 |
docker images / docker image ls | 列出镜像 |
docker rmi name:tag | 删除镜像 |
docker image prune | 清理 dangling 镜像 |
docker image prune -a | 清理所有未使用镜像 |
docker inspect name:tag | 查看镜像详情 |
docker history name:tag | 查看层历史 |
docker save name:tag -o file.tar | 导出镜像 |
docker load -i file.tar | 导入镜像 |
docker push name:tag | 推送到仓库 |
docker pull name:tag | 从仓库拉取 |
docker login | 登录仓库 |
docker logout | 登出仓库 |
docker system df | 磁盘占用 |
docker system prune -a | 全量清理 |
构建上下文优化
# 查看上下文大小
docker build -t myapp . 2>&1 | head -1
# => [internal] load build context transfer context: 2.56MB
# 使用 .dockerignore 减小上下文
echo "node_modules/" >> .dockerignore
echo ".git/" >> .dockerignore
echo ".env" >> .dockerignore导出/导入镜像
# 导出(含所有层)
docker save myapp:v1 -o myapp-v1.tar
docker save myapp:v1 | gzip > myapp-v1.tar.gz
# 导入
docker load -i myapp-v1.tar
docker load < myapp-v1.tar.gz常用构建模式
# CI 构建(拉取缓存 + 推送到仓库)
docker build \
--pull \
--cache-from ghcr.io/org/myapp:latest \
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
--build-arg VCS_REF=$(git rev-parse --short HEAD) \
--label "org.opencontainers.image.created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
--label "org.opencontainers.image.revision=$(git rev-parse --short HEAD)" \
-t ghcr.io/org/myapp:$(git rev-parse --short HEAD) \
-t ghcr.io/org/myapp:latest \
.
# 无上下文构建(仅 Dockerfile)
docker build -t myapp - < Dockerfile
镜像标签策略与生命周期
标签策略决策树
需要精确追溯?→ 是 → digest (@sha256:abc...) + git SHA tag
需要语义版本?→ 是 → semver (v1.2.3) + minor (v1.2) + major (v1)
需要自动部署?→ 是 → git SHA + latest(仅 stable 分支)
团队协作? → docker/metadata-action 自动生成标签矩阵推荐标签方案
# 每个 commit 打多标签
docker build \
-t myapp:sha-$(git rev-parse --short HEAD) \
-t myapp:v1.2.3 \
-t myapp:v1.2 \
-t myapp:v1 \
-t myapp:latest \
.
# 生产部署使用 digest
docker pull myapp@sha256:abc123def456...不可变标签最佳实践
| 标签类型 | 可变 | 推荐场景 |
|---|---|---|
:latest | ✅ 可变 | 开发环境、Demo |
:v1.2.3 | ⚠️ 应不可变 | 发布版本 |
:sha-abc1234 | ✅ 不可变 | CI 构建 |
@sha256:abc... | ✅ 不可变 | 生产部署 |
:dev / :prod | ✅ 可变 | ⚠️ 不推荐 |
docker/metadata-action 标签矩阵
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha,format=short
type=ref,event=branch
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}清理策略
# 保留最近 10 个 tag,删除其余
docker images myapp --format '{{.Tag}}' | sort -V | head -n -10 | xargs -I {} docker rmi myapp:{}
# 删除 30 天前的未使用镜像
docker image prune -a --filter "until=720h"
# 仅删除 dangling 镜像
docker image prune
BuildKit 基础:本地构建加速
启用 BuildKit
# 方式1:环境变量
export DOCKER_BUILDKIT=1
docker build -t myapp .
# 方式2:Daemon 配置(永久)
# /etc/docker/daemon.json
{ "features": { "buildkit": true } }
# 方式3:docker buildx(推荐)
docker buildx build -t myapp --load .
# 检查是否启用
docker buildx versionBuildKit 带来的提升
| 功能 | 传统构建 | BuildKit |
|---|---|---|
| 并行构建 | ❌ 串行 | ✅ 并行无依赖的层 |
| 构建缓存 | ❌ 仅本地 | ✅ --cache-from / --cache-to |
| 密钥挂载 | ❌ 嵌入层 | ✅ --mount=type=secret |
| 缓存挂载 | ❌ | ✅ --mount=type=cache |
| SSH 转发 | ❌ | ✅ --mount=type=ssh |
| 构建输出 | ❌ 仅镜像 | ✅ --output 导出文件 |
基础 BuildKit 用法
# 使用 registry 缓存
docker buildx build \
--cache-from type=registry,ref=myapp:buildcache \
--cache-to type=registry,ref=myapp:buildcache,mode=max \
-t myapp:latest \
--load .
# 行式输出(CI 友好)
docker buildx build --progress plain -t myapp --load .
# 仅构建不加载到本地
docker buildx build -t myapp .
# 镜像不在 docker images 中,需 --load 或 --push迁移到 buildx
# 传统
docker build -t myapp .
# 等价 buildx
docker buildx build -t myapp --load .
# 多 tag
docker build -t myapp:v1 -t myapp:latest .
docker buildx build -t myapp:v1 -t myapp:latest --load .常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
buildx build 后 docker images 看不到 | buildx 默认不加载到本地 | 加 --load |
--load 不支持多平台 | buildx 限制 | 单平台用 --load,多平台用 --push |
| 构建变慢 | driver 是 docker(非 docker-container) | docker buildx create --use |