docker build 命令

73 阅读4分钟

docker build 命令用于通过 Dockerfile 构建 Docker 镜像。它是 Docker 镜像构建过程的核心工具,允许用户自动化地构建并定制镜像。

docker build 命令基本格式:

docker build [OPTIONS] PATH | URL | -
  • PATH:指定 Docker 构建上下文的路径,可以是一个本地目录、URL 或 -
  • URL:指定一个远程 URL 作为构建上下文。
  • -:表示从标准输入读取 Dockerfile。

常用选项及详细说明:

  1. -t--tag

    • 为构建的镜像指定标签(名称:标签)。标签是镜像的唯一标识,通常采用 name:tag 的格式。
    • 如果没有提供 tag,默认会使用 latest 标签。
    • 示例:
      docker build -t myapp:latest .
      
      这会创建一个名为 myapp,标签为 latest 的镜像。
  2. -f--file

    • 指定一个 Dockerfile 文件。如果没有指定,默认会在当前目录查找 Dockerfile
    • 这可以让你指定不同的 Dockerfile,例如在多环境构建中使用不同的文件。
    • 示例:
      docker build -f ./Dockerfile.prod -t myapp:prod .
      
      这会使用 Dockerfile.prod 文件来构建镜像。
  3. --build-arg

    • 用于在构建过程中传递参数。可以在 Dockerfile 中使用这些构建参数。
    • 示例:
      docker build --build-arg VERSION=1.0 -t myapp:v1 .
      
      Dockerfile 中可以使用 ARG VERSION 来访问该参数。
      ARG VERSION
      RUN echo $VERSION
      
  4. --no-cache

    • 禁止使用缓存的中间层,这意味着每次构建时都会重新执行每个构建步骤。
    • 这对确保镜像是完全最新的很有帮助,特别是在需要更新依赖时。
    • 示例:
      docker build --no-cache -t myapp:latest .
      
  5. --pull

    • 强制每次构建时都从 Docker Hub 拉取最新的基础镜像,而不是使用本地缓存的镜像。
    • 示例:
      docker build --pull -t myapp:latest .
      
  6. --quiet-q

    • docker build 在构建时只输出镜像的 ID,而不会显示详细的构建日志。
    • 示例:
      docker build -q -t myapp:latest .
      
  7. --target

    • 用于指定多阶段构建中的构建目标阶段(Stage)。这在使用多阶段构建时非常有用。
    • 示例:
      docker build --target build_stage -t myapp:build .
      
  8. --rm

    • 默认情况下,Docker 在构建完成后会删除中间容器。如果不想删除中间容器,可以通过 --rm=false 来保持它们。
    • 示例:
      docker build --rm=false -t myapp:latest .
      
  9. --squash

    • 这个选项在 Docker 1.13 后提供,允许合并镜像的多个层(Layer)为一个单一的层,以减少最终镜像的大小。
    • 示例:
      docker build --squash -t myapp:latest .
      
  10. --no-cache

    • 不使用缓存来构建镜像。每个步骤都会被强制执行,即使之前已成功完成。
    • 示例:
      docker build --no-cache -t myapp:latest .
      
  11. -o

    • 用于设置构建的输出位置,输出格式可以是 type=dockertype=tar。例如,可以将构建的内容保存为 tar 文件。
    • 示例:
      docker build -o type=tar,dest=output.tar .
      
  12. -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 镜像的关键命令,灵活地配合不同选项,可以实现从简单构建到复杂的多阶段构建。在实际使用中,可以通过优化构建步骤、使用缓存和并行构建等手段提高构建效率并减少最终镜像的体积。