CLI开发工具【免费下载链接】cliThe Docker CLI项目地址https://gitcode.com/gh_mirrors/cli5/cli点击查看免费下载docker build是从 Dockerfile 构建镜像的核心命令本文基于 docs/reference/commandline/build.md 参考页完整梳理该命令的全部命令行选项与默认值并结合本仓库源码深入讲解构建上下文处理、资源限制参数、.dockerignore 过滤机制以及docker build转发至 buildx 的底层实现。读完本文你将掌握docker build每个参数的语义与适用场景并能在脚本化构建如--iidfile、--quiet与多阶段构建--target中正确选配参数。命令概览用法与别名docker build的完整用法为docker build [OPTIONS] PATH | URL | -其作用是Build an image from a Dockerfile从一个 Dockerfile 构建镜像。在命令注册层面该命令定义于 cli/command/image/build.go 的newBuildCommand中Use字段即为build [OPTIONS] PATH | URL | -且要求必须且仅接受 1 个位置参数Args: cli.ExactArgs(1)。该命令同时注册了三个别名含义完全相同别名说明docker build主命令形式docker image build按资源类型组织的子命令形式docker builder build在builder管理构建命令组下的形式命令的 Annotations 中记录了aliases: docker image build, docker build, docker builder build这就是三个别名同源的直接依据。在 cli/command/builder/cmd.go 中builder命令组通过image.NewBuildCommand(dockerCLI)挂载了 build 子命令同时注册了bake占位命令BuildKit 启用且安装 buildx 插件后会被动态替换为docker buildx bake的别名。完整选项表参数即命令骨架下表完整继承自参考文档包含每个选项的类型与默认值是docker build的命令骨架选项类型默认值说明--add-hostlist添加自定义主机到 IP 的映射host:ip--build-arglist设置构建时变量--cache-fromstringSlice作为缓存来源的镜像--cgroup-parentstring为构建期间的RUN指令设置父 cgroup--compressbool使用 gzip 压缩构建上下文--cpu-periodint640限制 CPU CFS完全公平调度器周期--cpu-quotaint640限制 CPU CFS完全公平调度器配额-c,--cpu-sharesint640CPU 份额相对权重--cpuset-cpusstring允许执行的 CPU0-3、0,1--cpuset-memsstring允许执行的内存节点0-3、0,1-f,--filestringDockerfile 名称默认是PATH/Dockerfile--force-rmbool总是移除中间容器--iidfilestring将镜像 ID 写入该文件--isolationstring容器隔离技术--labellist为镜像设置元数据-m,--memorybytes0内存限制--memory-swapbytes0Swap 限制等于内存加 swap-1表示启用无限 swap--networkstringdefault为构建期间的RUN指令设置网络模式--no-cachebool构建镜像时不使用缓存--platformstring若服务器支持多平台则设置平台--pullbool总是尝试拉取镜像的更新版本-q,--quietbool抑制构建输出成功时仅打印镜像 ID--rmbooltrue成功构建后移除中间容器--security-optstringSlice安全选项--shm-sizebytes0/dev/shm的大小--squashbool将新构建的层压缩为单个新层-t,--taglist名称及可选标签格式为name:tag--targetstring设置要构建的目标构建阶段--ulimitulimitUlimit 选项这些选项在源码中对应 cli/command/image/build.go 的buildOptions结构体字段并由imageBuildOptions()函数cli/command/image/build.go逐项映射为client.ImageBuildOptions传给 daemon 的/buildAPI。下面按功能域分组深入讲解。上下文与 Dockerfile构建的输入模型三种位置参数形式PATH | URL | -docker build的位置参数决定了构建上下文的来源源码中通过build.DetectContextType(options.context)判断类型见 cli/command/image/build.go本地目录PATH调用build.GetContextFromLocalDir将目录打包成 tar 作为上下文如果目录是符号链接会先EvalSymlinks解析到真实目录见 cli/command/image/build/context.go。Git 仓库 URL调用build.GetContextFromGitURL先用git clone将仓库克隆到临时目录再作为上下文并要求 Dockerfile 必须位于构建上下文之内见 cli/command/image/build/context.go。远程 URL调用build.GetContextFromURL下载资源并通过进度读取器打印Downloading build context from remote url进度信息见 cli/command/image/build/context.go。STDIN-通过build.GetContextFromReader读取会先探测输入是 tar 归档还是 Dockerfile 文本若是 tar 归档则直接作为上下文若是 Dockerfile 则写入临时目录后重新打包见 cli/command/image/build/context.go。注意一个限制若用-f -从 STDIN 读取 Dockerfile则不能同时用-作为构建上下文源码会直接报错invalid argument: cant use stdin for both build context and dockerfile。-f, --file指定 Dockerfile 路径默认 Dockerfile 文件名是DockerfiledefaultDockerfileName常量见 cli/command/image/build/context.go。源码中getDockerfileRelPath的逻辑显示未指定-f时优先查找上下文目录下的Dockerfile找不到时再兼容查找小写的dockerfile。-f指定的 Dockerfile 若位于构建上下文之外相对路径以..开头CLI 会直接读取该文件内容并在打包时注入上下文见 cli/command/image/build.go 与 cli/command/image/build/context.go 的AddDockerfileToBuildContext。注意使用本地目录作为上下文时-f的路径是相对于当前工作目录而非上下文目录解析的。--target多阶段构建的定点输出--target指定 Dockerfile 中要构建的目标构建阶段stage用于多阶段构建multi-stage build场景。它最终透传为ImageBuildOptions.Target。典型用法是只构建到中间产物阶段例如docker build --target builder -t myapp:build .避免最终阶段引入的不必要内容。镜像元数据命名、变量与标签-t, --tag镜像名称与标签格式为name:tag可以多次指定list类型一个构建产物可同时打多个标签。该参数使用opts.NewListOpts(validateTag)收集validateTag通过reference.ParseNormalizedNamed校验名称合法性见 cli/command/image/build.go。--build-arg构建时变量用于向构建过程传递变量如--build-arg HTTP_PROXYhttp://proxy:8080对应 Dockerfile 中的ARG指令。源码中通过opts.ValidateEnv校验键值格式并会与配置文件中的代理设置合并configFile.ParseProxyConfig(...)会自动补充HTTP_PROXY、HTTPS_PROXY、NO_PROXY、FTP_PROXY等代理相关构建参数见 cli/command/image/build.go。--label镜像元数据为构建出的镜像添加标签格式keyvalue使用opts.ValidateLabel校验可多次指定。常用于记录构建信息例如--label org.opencontainers.image.sourcehttps://example.com/project。构建过程行为控制--no-cache与--pull缓存策略--no-cache构建时完全不使用缓存层每次都重新执行所有指令。--pull总是尝试拉取基础镜像的最新版本即使本地已有保证基础镜像不过期。--rm与--force-rm中间容器清理--rm默认值为true成功构建后移除中间容器。--force-rm总是移除中间容器即使构建失败便于排查构建占用空间问题。-q, --quiet与--iidfile脚本化构建输出-q, --quiet抑制构建输出成功时仅向 stdout 打印镜像 ID。源码实现上会把进度与构建输出缓冲到内存缓冲区bytes.NewBuffer仅当LastUpdate时输出进度lastProgressOutput见 cli/command/image/build.go最终把 daemon 返回的镜像 ID 打印到 stdout。--iidfile把镜像 ID 写入指定文件。源码会先删除可能残留的旧文件避免陈旧结果并在服务器未返回镜像 ID 时明确报错见 cli/command/image/build.go。两者常组合用于 CI 流水线中例如docker build -q --iidfile image.id .后由下游任务读取该文件。--compress与--cache-from传输与缓存优化--compress用 gzip 压缩发送给 daemon 的构建上下文 tar 流见 cli/command/image/build/context.go 的Compress函数。--cache-from指定作为缓存来源的镜像列表stringSlice配合外部缓存镜像如导出后的构建缓存加速重复构建。--network与--add-hostRUN 指令的网络环境--network默认值为default设置构建期间RUN指令的网络模式可选none、host等。该选项从 API 版本 1.25 起可用。--add-host添加host:ip自定义主机映射如--add-hostmyhost:192.168.1.100等同于在构建环境中注入/etc/hosts条目。--security-opt与--isolation安全与隔离--security-opt传递安全选项stringSlice例如--security-opt seccompunconfined或--security-opt labeldisable。--isolation指定容器隔离技术如 Windows 上的process、hypervLinux 下通常无需设置。--squash与--platform--squash将新构建的多个层压缩为单个新层。该选项在源码中标注为experimentalAnnotationsquash - experimentalAPI 版本 1.25 起属于实验特性。--platform设置构建平台如linux/amd64、linux/arm64。默认值取自DOCKER_DEFAULT_PLATFORM环境变量见 cli/command/image/build.go该选项自 API 版本 1.38 起可用且命令注册了completion.Platforms()平台补全函数。构建前会先通过platforms.Parse校验格式合法性。资源限制参数CPU 与内存这类参数直接映射到client.ImageBuildOptions的对应字段最终由 daemon 在构建容器上施加 cgroup 限制参数字段说明-m, --memoryMemory内存上限bytes0表示不限制--memory-swapMemorySwap内存加 swap 的总上限-1表示启用无限 swap--shm-sizeShmSize/dev/shm大小bytes用于构建中涉及共享内存的场景-c, --cpu-sharesCPUSharesCPU 相对权重默认0即 1024 基准--cpu-periodCPUPeriodCFS 调度周期微秒默认0表示使用系统默认--cpu-quotaCPUQuotaCFS 配额微秒配合--cpu-period使用--cpuset-cpusCPUSetCPUs允许使用的 CPU 集合如0-3或0,1--cpuset-memsCPUSetMems允许使用的内存节点集合NUMA如0-3--cgroup-parentCgroupParentRUN指令所在 cgroup 的父级--ulimitUlimits资源上限如--ulimit nofile1024:2048可多次指定对应的字段映射见 cli/command/image/build.go。需要说明的是--cpu-period与--cpu-quota依赖宿主内核的 CFS 支持Linux 下需配合 cgroup v1/v2 环境使用。.dockerignore构建上下文裁剪机制当使用本地目录作为构建上下文时CLI 会先读取上下文目录下的.dockerignore文件见 cli/command/image/build/dockerignore.go将匹配模式作为排除规则。随后ValidateContextDirectory逐文件校验上下文可读性并依据排除规则跳过被忽略的路径见 cli/command/image/build/context.goTrimBuildFilesFromExcludes会保证 Dockerfile 与.dockerignore本身始终进入上下文追加!.dockerignore、!Dockerfile反向规则见 cli/command/image/build/dockerignore.go最终通过archive.TarWithOptions按排除规则打包上下文见 cli/command/image/build.go。因此合理的.dockerignore排除node_modules、.git、*.log等能显著减小上下文体积、加快构建。另外--compress只压缩网络传输不会改变上下文内容本身。底层机制docker build如何转发到 buildx当前仓库中docker build默认通过 cmd/docker/builder.go 的processBuilder逻辑将命令转发给 buildx 插件。转发规则定义在forwardBuilder函数cmd/docker/builder.go覆盖以下命令形态用户输入转发为记录的命令路径前缀docker builddocker buildx build无docker image builddocker buildx buildimagedocker builder subdocker buildx subbuilderdocker bakedocker buildx bake无转发过程中的关键决策逻辑DOCKER_BUILDKIT环境变量为空时默认走 BuildKit 路径显式设为0时禁用 BuildKit 并回退到旧版legacy构建器同时打印弃用警告DEPRECATED: The legacy builder is deprecated and will be removed in a future release.设为1时强制使用 buildx若插件缺失或损坏则直接报错见 cmd/docker/builder.go。测试用例 cmd/docker/builder_test.go 的TestBuildkitDisabled与TestBuilderBrokenEnforced验证了这两条路径。--builder参数与BUILDX_BUILDER环境变量hasBuilderName会检查命令行与环境中是否显式指定了 builder 名称若未指定转发时会自动注入BUILDX_BUILDER当前上下文名环境变量确保docker build始终使用默认 context 对应的 builder见 cmd/docker/builder.go测试TestBuildWithBuilder验证了BUILDX_BUILDERdefault的注入行为。别名机制可在配置文件~/.docker/config.json的aliases字段中将builder映射到自定义插件如{builder: buildx}仅builder键被允许见 cmd/docker/aliases.go。需要说明的是BuildKitbuildx的完整选项集比本文所列的旧版构建器选项更丰富本文以参考文档列出的选项为准启用 BuildKit 后docker build --help会展示 buildx 的完整帮助。实战示例# 1. 基础构建使用默认 Dockerfile打标签 docker build -t myapp:latest . # 2. 指定 Dockerfile 与构建参数 docker build -f docker/prod.Dockerfile \ --build-arg VERSION2.1.0 \ -t myapp:2.1.0 . # 3. 多阶段构建定位目标阶段 docker build --target builder -t myapp:build . # 4. 脚本化构建安静模式 写入镜像 ID 文件 docker build -q --iidfile image.id -t myapp:ci . cat image.id # 5. 限制构建资源配合 cgroup docker build --memory 1g --memory-swap 1.5g --cpuset-cpus 0,1 -t myapp . # 6. 从 Git 仓库上下文构建 docker build https://github.com/example/project.git#main # 7. 从 STDIN 提供 Dockerfile docker build -f - . Dockerfile # 8. 添加自定义主机映射并禁用缓存 docker build --add-host api.internal:10.0.0.5 --no-cache -t myapp .版本与兼容性说明--network与--squash自 API 版本 1.25 起可用其中--squash标注为实验特性。--platform自 API 版本 1.38 起可用默认值来源于DOCKER_DEFAULT_PLATFORM环境变量。docker builder命令组含prune等子命令标注版本为 1.31builder prune标注为 1.39。旧版构建器已进入弃用流程DOCKER_BUILDKIT0或缺少 buildx 插件时会收到弃用警告建议安装 buildx 组件以使用 BuildKit 进行构建。赞分享CLI开发工具【免费下载链接】cliThe Docker CLI项目地址https://gitcode.com/gh_mirrors/cli5/cli点击查看免费下载相关推荐Docker CLI 镜像清理实战docker image prune 命令详解与底层实现Docker CLI 镜像清理实战docker image prune 命令详解与底层实现 docker image prune 是 Docker CLI 中CLI开发工具在 nix-darwin 中集成 Home Manager 模块macOS 用户环境的声明式管理实战在 nix darwin 中集成 Home Manager 模块macOS 用户环境的声明式管理实战 本文围绕 Home Manager 提供的 nix daCLI开发工具Hugo build 命令详解完整 CLI 参数、默认行为与底层构建管线Hugo build 命令详解完整 CLI 参数、默认行为与底层构建管线 hugo build 是 HugoThe worlds fastest fram开发工具前端CLI上一篇Lightweight Charts™ 可刷选区域序列Brushable Area Series插件完全指南1.0.0 特性、选项体系与源码实现剖析下一篇jQuery Mockjax 使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考