学习 Dockerfile 常用指令
在构建 Docker 镜像时,Dockerfile
文件是一份至关重要的配置文件,它定义了构建镜像的所有步骤。通过在 Dockerfile
中使用不同的指令(命令),我们可以控制镜像的构建过程、设置环境、指定执行命令等。本文将为你详细介绍 Dockerfile 中常用的指令及其用途,帮助你更好地理解和使用 Docker。
1. FROM
FROM
是 Dockerfile 中最基本的指令,它指定了基础镜像,所有的 Docker 镜像都需要从某个基础镜像开始构建。
-
作用:指定基础镜像。
-
语法 :
dockerfileFROM <image-name>:<tag>
-
示例 :
dockerfileFROM node:20-slim
解释 :这个指令表示使用
node:20-slim
作为基础镜像。
2. RUN
RUN
指令用于在镜像构建时执行命令。它可以用来安装软件包、运行脚本等,常用于配置和安装依赖。
-
作用:在镜像构建时执行命令。
-
语法 :
dockerfileRUN <command>
-
示例 :
dockerfileRUN apt-get update && apt-get install -y curl
解释 :该指令更新包管理器并安装
curl
。
3. CMD
CMD
指令指定容器启动时执行的默认命令。如果用户没有在运行容器时指定其他命令,Docker 将执行 CMD
中定义的命令。
-
作用:指定容器启动时的默认命令。
-
语法 :
dockerfileCMD ["executable", "param1", "param2"]
或者
dockerfileCMD command param1 param2
-
示例 :
dockerfileCMD ["node", "server.js"]
解释 :如果用户未指定其他命令,容器启动时将执行
node server.js
。
4. ENTRYPOINT
ENTRYPOINT
和 CMD
类似,但具有更强的控制力。无论你传递什么命令给 docker run
,ENTRYPOINT
定义的命令都会被执行。CMD
可以用来提供默认参数。
-
作用:指定容器启动时始终执行的命令。
-
语法 :
dockerfileENTRYPOINT ["executable", "param1", "param2"]
-
示例 :
dockerfileENTRYPOINT ["node", "server.js"]
解释 :容器启动时始终执行
node server.js
,无论传入什么命令行参数。
5. WORKDIR
WORKDIR
指令用于设置容器中的工作目录,所有后续的命令(如 RUN
、CMD
)都将在该目录下执行。
-
作用:设置工作目录。
-
语法 :
dockerfileWORKDIR <path>
-
示例 :
dockerfileWORKDIR /app
解释 :将工作目录设置为
/app
,后续的操作会在此目录下进行。
6. COPY
COPY
指令用于将文件或目录从主机复制到容器的指定位置。
-
作用:复制本地文件或目录到容器中。
-
语法 :
dockerfileCOPY <source> <destination>
-
示例 :
dockerfileCOPY . /app
解释 :将当前目录(主机中的
.
)复制到容器中的/app
目录。
7. ADD
ADD
指令类似于 COPY
,但功能更强大,支持从 URL 下载文件并自动解压文件。
-
作用:将本地文件或远程文件复制到容器,并且支持解压。
-
语法 :
dockerfileADD <source> <destination>
-
示例 :
dockerfileADD ./config.tar.gz /app/config/
解释 :该指令将压缩包
config.tar.gz
解压到容器中的/app/config/
目录。
8. ENV
ENV
指令用于设置环境变量,这些变量会在容器的整个生命周期中可用。
-
作用:设置环境变量。
-
语法 :
dockerfileENV <key>=<value>
-
示例 :
dockerfileENV NODE_ENV production
解释 :设置环境变量
NODE_ENV
为production
,后续的命令或运行时都能访问到这个环境变量。
9. EXPOSE
EXPOSE
指令用于声明容器监听的端口,通常用于文档说明,告诉其他开发者容器会监听哪些端口。它不会实际打开端口。
-
作用:声明容器暴露的端口。
-
语法 :
dockerfileEXPOSE <port>
-
示例 :
dockerfileEXPOSE 3000
解释 :声明容器会监听端口
3000
,容器在运行时,可以通过docker run -p
映射到主机端口。
10. VOLUME
VOLUME
指令用于创建一个挂载点,可以将宿主机的目录或 Docker 卷挂载到容器中,以便数据持久化。
-
作用:定义容器挂载点,持久化数据。
-
语法 :
dockerfileVOLUME ["/path"]
-
示例 :
dockerfileVOLUME ["/data"]
解释 :创建一个名为
/data
的挂载点,可以将容器中的数据持久化。
11. USER
USER
指令用于指定在容器中运行后续命令的用户,通常为了安全考虑,避免以 root
用户运行容器。
-
作用:指定容器内运行命令的用户。
-
语法 :
dockerfileUSER <username>
-
示例 :
dockerfileUSER node
解释 :后续命令将以
node
用户身份执行。
12. HEALTHCHECK
HEALTHCHECK
指令定义容器的健康检查命令。Docker 会周期性地执行这个命令来检查容器是否运行正常。
-
作用:定义健康检查命令。
-
语法 :
dockerfileHEALTHCHECK CMD <command>
-
示例 :
dockerfileHEALTHCHECK CMD curl --fail http://localhost:3000/health || exit 1
解释 :容器会定期执行
curl
命令来检查应用是否可用。
13. STOPSIGNAL
STOPSIGNAL
指令用于定义容器停止时发送的信号,默认情况下是 SIGTERM
。
-
作用:定义停止容器时的信号。
-
语法 :
dockerfileSTOPSIGNAL <signal>
-
示例 :
dockerfileSTOPSIGNAL SIGKILL
解释 :当容器停止时,Docker 将发送
SIGKILL
信号,而不是默认的SIGTERM
。
14. ARG
ARG
指令用于定义构建时的变量,它的作用范围仅限于构建阶段。
-
作用:定义构建时的变量。
-
语法 :
dockerfileARG <name>[=<default value>]
-
示例 :
dockerfileARG NODE_VERSION=20 FROM node:${NODE_VERSION}-slim
解释 :定义
NODE_VERSION
变量,并在FROM
中使用该变量。
总结
指令 | 作用 | 执行时机 |
---|---|---|
FROM | 指定镜像基础 | 构建时 |
RUN | 执行命令,生成中间镜像 | 构建时 |
CMD | 容器启动时的默认命令 | 容器运行时 |
ENTRYPOINT | 容器启动时强制执行的命令 | 容器运行时 |
WORKDIR | 指定工作目录 | 构建+运行时 |
COPY | 复制本地文件 | 构建时 |
ADD | 复制或解压本地/URL 文件 | 构建时 |
ENV | 设置环境变量 | 构建+运行时 |
EXPOSE | 指定要暴露的端口 | 仅用于文档 |
VOLUME | 定义可挂载的存储路径 | 容器运行时 |
USER | 指定运行命令的用户 | 构建+运行时 |
HEALTHCHECK | 健康检查 | 容器运行时 |
掌握这些常用指令,可以帮助你更加高效地编写和管理 Dockerfile,构建出高质量的 Docker 镜像。希望本文能对你有所帮助,欢迎留言交流!