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
的镜像。
docker build -t myimage:latest .
4.2 定制化 build
命令
docker build
命令的主要参数
docker build
命令支持很多选项,可以让你定制化构建流程。
1. 参数 -t
, --tag
参数 -t
或 --tag
用于指定创建的镜像的名称和标签。
docker build -t myimage:latest .
2. 参数 -f
, --file
参数 -f
或 --file
用于指定非默认的 Dockerfile 文件。
docker build -f Dockerfile.dev -t myimage:dev .
3. 参数 --build-arg
参数 --build-arg
用于传递通过 Dockerfile 中的 ARG 指令定义的构建参数。
docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .
4. 参数 --no-cache
参数 --no-cache
让构建过程不使用缓存。如果你想确保每条指令都是重新执行的,这个选项很有用。
docker build --no-cache -t myimage:latest .
5. 参数 --target
参数 --target
用于在多阶段构建中指定目标阶段。
docker build --target builder -t myimage:builder .
6. 参数 --rm
参数 --rm
让 Docker 在成功构建镜像后删除中间容器(默认开启)。
docker build --rm -t myimage:latest .
4.3 Docker build 示例
示例 1: 基础构建
假设你有一个简单的 Node.js 应用程序,并且你想为其部署创建一个 Docker 镜像。
Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
构建命令:
docker build -t mynodeapp:latest .
在这个示例中,Docker 将使用当前目录中的 Dockerfile 创建一个标签为 latest
的 mynodeapp
镜像。
示例 2: 使用构建参数的构建
构建参数允许在构建时将变量传递到 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"]
构建命令:
docker build --build-arg APP_VERSION=1.0 -t mynodeapp:1.0 .
在这个示例中,构建参数 APP_VERSION
被传递到 Dockerfile,从而允许在构建时设置应用程序的版本。
示例 3: 多阶段构建
多阶段构建用于创建仅包含必要组件的镜像。这可以减少最终镜像的大小。
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
构建命令:
docker build -t mywebapp:latest .
在这个示例中,首先创建了一个中间镜像 builder,其中完成了应用程序的构建。在构建完成后,应用程序被转移到一个最终镜像中,该镜像使用 Nginx 来提供静态内容服务。
4.4 实用建议
1. 优化指令顺序
为了高效利用 Docker 的缓存,指令的顺序很重要。例如,先复制那些很少更改的文件,比如 package.json
,以尽量减少依赖的重建。然后再复制其他文件。
COPY package*.json ./
RUN npm install
COPY . .
2. 使用 .dockerignore
添加一个 .dockerignore
文件,排除构建上下文中不需要的文件和目录。这样可以减少上下文的大小,加快镜像的构建速度。
.dockerignore
示例:
node_modules
dist
*.log
3. 多阶段构建
使用多阶段构建可以创建精简轻量的镜像。这种方法只包含应用运行所需的文件和依赖,排除最终镜像中不必要的数据,比如临时文件或源代码。
GO TO FULL VERSION