CodeGym /课程 /Docker SELF /构建镜像

构建镜像

Docker SELF
第 13 级 , 课程 3
可用

4.1 docker build命令基础

docker build命令 是从Dockerfile创建Docker镜像的主要方式。它会从Dockerfile中读取指令,并逐步执行它们,最终通过各个层构建出镜像。在这节课中,我们会讲解docker build如何工作,它有哪些参数以及如何在实际中使用它。

docker build命令会从Dockerfile和所谓的构建上下文中构建镜像。构建上下文是Docker用来创建镜像的文件。它可以是你本地机器上的文件夹,或者比如是GitHub上的一个仓库。

语法


docker build [OPTIONS] PATH | URL | -

其中:

  • PATH: 包含Dockerfile和构建上下文的目录的路径。
  • URL: 远程仓库的URL地址。
  • -: 从标准输入(stdin)读取Dockerfile。

基本使用示例

这个示例中,Docker会从当前目录(.)中的Dockerfile构建镜像,并创建一个名字为myimage,标签为latest的镜像。

Terminal

docker build -t myimage:latest .

4.2 定制化 build 命令

docker build 命令的主要参数

docker build 命令支持很多选项,可以让你定制化构建流程。

1. 参数 -t, --tag

参数 -t--tag 用于指定创建的镜像的名称和标签。

Terminal

docker build -t myimage:latest .

2. 参数 -f, --file

参数 -f--file 用于指定非默认的 Dockerfile 文件。

Terminal

docker build -f Dockerfile.dev -t myimage:dev .

3. 参数 --build-arg

参数 --build-arg 用于传递通过 Dockerfile 中的 ARG 指令定义的构建参数。

Terminal

docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .

4. 参数 --no-cache

参数 --no-cache 让构建过程不使用缓存。如果你想确保每条指令都是重新执行的,这个选项很有用。

Terminal

docker build --no-cache -t myimage:latest .

5. 参数 --target

参数 --target 用于在多阶段构建中指定目标阶段。

Terminal

docker build --target builder -t myimage:builder .

6. 参数 --rm

参数 --rm 让 Docker 在成功构建镜像后删除中间容器(默认开启)。

Terminal

docker build --rm -t myimage:latest .

4.3 Docker build 示例

示例 1: 基础构建

假设你有一个简单的 Node.js 应用程序,并且你想为其部署创建一个 Docker 镜像。

Dockerfile:

dockerfile

FROM node:14

WORKDIR /app
        
COPY package*.json ./
RUN npm install
        
COPY . .
        
EXPOSE 3000
        
CMD ["node", "app.js"]

构建命令:

Terminal

docker build -t mynodeapp:latest .

在这个示例中,Docker 将使用当前目录中的 Dockerfile 创建一个标签为 latestmynodeapp 镜像。

示例 2: 使用构建参数的构建

构建参数允许在构建时将变量传递到 Dockerfile 中。

Dockerfile

dockerfile

FROM node:14

ARG APP_VERSION
ENV APP_VERSION=${APP_VERSION}
        
WORKDIR /app
        
COPY package*.json ./
RUN npm install
        
COPY . .
        
EXPOSE 3000
        
CMD ["node", "app.js"]

构建命令:

Terminal

docker build --build-arg APP_VERSION=1.0 -t mynodeapp:1.0 .

在这个示例中,构建参数 APP_VERSION 被传递到 Dockerfile,从而允许在构建时设置应用程序的版本。

示例 3: 多阶段构建

多阶段构建用于创建仅包含必要组件的镜像。这可以减少最终镜像的大小。

Dockerfile

Dockerfile


# 构建阶段
FROM node:14 AS builder
        
WORKDIR /app
        
COPY package*.json ./
RUN npm install
        
COPY . .
RUN npm run build
        
# 生成仅包含必要文件的最终镜像
FROM nginx:alpine
        
COPY --from=builder /app/build /usr/share/nginx/html

构建命令:

Terminal


docker build -t mywebapp:latest .

在这个示例中,首先创建了一个中间镜像 builder,其中完成了应用程序的构建。在构建完成后,应用程序被转移到一个最终镜像中,该镜像使用 Nginx 来提供静态内容服务。

4.4 实用建议

1. 优化指令顺序

为了高效利用 Docker 的缓存,指令的顺序很重要。例如,先复制那些很少更改的文件,比如 package.json,以尽量减少依赖的重建。然后再复制其他文件。

dockerfile

COPY package*.json ./
RUN npm install
COPY . .

2. 使用 .dockerignore

添加一个 .dockerignore 文件,排除构建上下文中不需要的文件和目录。这样可以减少上下文的大小,加快镜像的构建速度。

.dockerignore 示例:

Text

node_modules
dist
*.log

3. 多阶段构建

使用多阶段构建可以创建精简轻量的镜像。这种方法只包含应用运行所需的文件和依赖,排除最终镜像中不必要的数据,比如临时文件或源代码。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION