docker build
命令用于通过 Dockerfile
构建 Docker 镜像。它是 Docker 镜像构建过程的核心工具,允许用户自动化地构建并定制镜像。
docker build
命令基本格式:
docker build [OPTIONS] PATH | URL | -
PATH
:指定 Docker 构建上下文的路径,可以是一个本地目录、URL 或-
。URL
:指定一个远程 URL 作为构建上下文。-
:表示从标准输入读取 Dockerfile。
常用选项及详细说明:
-
-t
或--tag
:- 为构建的镜像指定标签(名称:标签)。标签是镜像的唯一标识,通常采用
name:tag
的格式。 - 如果没有提供
tag
,默认会使用latest
标签。 - 示例:
这会创建一个名为docker build -t myapp:latest .
myapp
,标签为latest
的镜像。
- 为构建的镜像指定标签(名称:标签)。标签是镜像的唯一标识,通常采用
-
-f
或--file
:- 指定一个
Dockerfile
文件。如果没有指定,默认会在当前目录查找Dockerfile
。 - 这可以让你指定不同的
Dockerfile
,例如在多环境构建中使用不同的文件。 - 示例:
这会使用docker build -f ./Dockerfile.prod -t myapp:prod .
Dockerfile.prod
文件来构建镜像。
- 指定一个
-
--build-arg
:- 用于在构建过程中传递参数。可以在
Dockerfile
中使用这些构建参数。 - 示例:
在docker build --build-arg VERSION=1.0 -t myapp:v1 .
Dockerfile
中可以使用ARG VERSION
来访问该参数。ARG VERSION RUN echo $VERSION
- 用于在构建过程中传递参数。可以在
-
--no-cache
:- 禁止使用缓存的中间层,这意味着每次构建时都会重新执行每个构建步骤。
- 这对确保镜像是完全最新的很有帮助,特别是在需要更新依赖时。
- 示例:
docker build --no-cache -t myapp:latest .
-
--pull
:- 强制每次构建时都从 Docker Hub 拉取最新的基础镜像,而不是使用本地缓存的镜像。
- 示例:
docker build --pull -t myapp:latest .
-
--quiet
或-q
:- 让
docker build
在构建时只输出镜像的 ID,而不会显示详细的构建日志。 - 示例:
docker build -q -t myapp:latest .
- 让
-
--target
:- 用于指定多阶段构建中的构建目标阶段(Stage)。这在使用多阶段构建时非常有用。
- 示例:
docker build --target build_stage -t myapp:build .
-
--rm
:- 默认情况下,Docker 在构建完成后会删除中间容器。如果不想删除中间容器,可以通过
--rm=false
来保持它们。 - 示例:
docker build --rm=false -t myapp:latest .
- 默认情况下,Docker 在构建完成后会删除中间容器。如果不想删除中间容器,可以通过
-
--squash
:- 这个选项在 Docker 1.13 后提供,允许合并镜像的多个层(Layer)为一个单一的层,以减少最终镜像的大小。
- 示例:
docker build --squash -t myapp:latest .
-
--no-cache
:- 不使用缓存来构建镜像。每个步骤都会被强制执行,即使之前已成功完成。
- 示例:
docker build --no-cache -t myapp:latest .
-
-o
:- 用于设置构建的输出位置,输出格式可以是
type=docker
或type=tar
。例如,可以将构建的内容保存为 tar 文件。 - 示例:
docker build -o type=tar,dest=output.tar .
- 用于设置构建的输出位置,输出格式可以是
-
-c
:- 用于设定构建的并行程度。通常用于通过并行处理来加速构建过程。
- 示例:
docker build -c 4 -t myapp:latest .
构建上下文:
构建上下文是构建过程中的目录或路径,Docker 会从中获取文件以及构建时所需的资源(包括 Dockerfile
)。常见的构建上下文有:
- 当前目录 (
.
):指定当前目录作为构建上下文。 - 路径:指定本地路径,作为构建上下文。
- URL:也可以使用 Git 仓库的 URL 作为构建上下文。例如:
docker build https://github.com/myrepo/myapp.git
构建过程示例:
假设我们有如下简单的 Dockerfile
:
# 基础镜像
FROM node:14
# 工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json 文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["npm", "start"]
我们可以使用以下命令构建镜像:
docker build -t myapp:latest .
构建多阶段镜像:
多阶段构建允许你在一个 Dockerfile
中使用多个阶段,这样可以优化镜像大小。通过 --target
选择指定阶段。
示例 Dockerfile:
# 第一阶段:构建应用
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
# 第二阶段:运行应用
FROM node:14
WORKDIR /app
COPY --from=build /app/dist /app
EXPOSE 3000
CMD ["npm", "start"]
构建命令:
docker build -t myapp:multi-stage .
总结:
docker build
是构建 Docker 镜像的关键命令,灵活地配合不同选项,可以实现从简单构建到复杂的多阶段构建。在实际使用中,可以通过优化构建步骤、使用缓存和并行构建等手段提高构建效率并减少最终镜像的体积。