3.1 指令 FROM
那么,提醒一下,Dockerfile 是一个包含构建 Docker 镜像指令的文本文件。Dockerfile 中的每条指令都执行特定任务并在镜像中创建一个新层。 在这节讲座中,我们将更深入地了解 Dockerfile 的主要指令:FROM、RUN、COPY 和 CMD,它们是创建功能性和高效 Docker 镜像的关键。
指令 FROM 定义了将用来创建新镜像的基础镜像。这是任何 Dockerfile 中的第一条指令,它定义了构建镜像的起点。
语法
FROM <image>[:<tag>] [AS <name>]
其中:
<image>: 基础镜像的名称。<tag>: (可选)基础镜像的版本。默认使用latest。AS <name>: (可选)为此构建阶段指定的名称(用于多阶段构建)。
示例
使用基础镜像 Ubuntu:
FROM ubuntu:20.04
使用官方镜像 Node.js:
FROM node:14
使用 多阶段构建进行优化:
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
在这个例子中,使用了两个基础镜像。第一个 (node:14) 用于构建应用程序,第二个 (nginx:alpine) — 用于创建一个轻量级服务器来提供静态文件服务。
通过使用多阶段构建,最终镜像只包含最小的文件和程序集(在这个例子中是 Nginx 和构建后的静态文件),使其更轻量化并且部署速度更快。
3.2 指令 RUN
指令 RUN 在容器内部执行命令并在镜像中创建一个新层。这个指令用来安装包、设置环境和执行其他为准备镜像而需要的命令。
语法:
RUN <command>
其中:
<command>: 在容器内执行的命令。
示例:
在 Ubuntu 镜像里安装包:
RUN apt-get update && apt-get install -y curl git
代码编译:
RUN gcc -o myapp myapp.c
合并多条命令
为了减少层的数量、降低 image 的大小并加快构建速度,推荐将多条命令合并到一个 RUN 指令中。
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 指令 COPY
指令 COPY 会将文件和目录从构建的上下文复制到容器的文件系统中。这个很方便用来把源代码、配置文件以及其他资源放进容器。
语法:
COPY <src> <dest>
这里:
-
<src>: 构建上下文中文件或者目录的路径。 <dest>: 容器中的目标路径。
例子:
将当前目录的所有内容复制到容器的工作目录:
COPY . /app
复制单个文件:
COPY package.json /app/package.json
COPY server.js /app/server.js
使用 .dockerignore
要在复制过程中排除不需要的文件,可以使用 .dockerignore 文件,它的工作方式与 .gitignore 类似。
node_modules
dist
*.log
3.4 指令 CMD
指令 CMD 设置了在容器启动时执行的命令。不同于 RUN 在构建阶段执行,CMD 是在从已创建的镜像启动容器时执行。
语法:
CMD ["executable","param1","param2"]
或者
CMD command param1 param2
其中:
- ["executable","param1","param2"]: exec 格式,更推荐用于确保信号处理的正确性。
- command param1 param2:
shell格式,在 shell 中执行命令。
示例:
运行 Node.js 应用:
CMD ["node", "app.js"]
运行 shell 脚本:
CMD /usr/bin/myscript.sh
CMD 与 ENTRYPOINT 的区别
CMD 设置了默认命令,在容器启动时可以被覆盖。而 ENTRYPOINT 设置了固定命令,容器启动时总会执行。
使用 ENTRYPOINT 的示例:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
在这个例子中,ENTRYPOINT 启动 Python 脚本,而 CMD 传递可以在容器启动时更改的参数。
包含主要指令的 Dockerfile 示例
# 使用 Node.js 基础镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json 文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用源码
COPY . .
# 指定应用使用的端口
EXPOSE 3000
# 定义应用启动命令
CMD ["node", "app.js"]
GO TO FULL VERSION