Skip to content

Dockerfile

什么是 Dockerfile?

Docker 镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的 指令 (Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

Dockerfile 文件格式

指令参数描述
FROMimage指定基础镜像
MAINTAINERname镜像维护者信息
RUNcommand在容器内部执行命令
CMDcommand容器启动时执行命令
EXPOSEport声明容器需要监听的端口
ENVkey=value设置环境变量
ADDsrc dest复制文件或目录到容器内部
COPYsrc dest复制文件或目录到容器内部
ENTRYPOINTcommand容器启动时执行的命令
VOLUMEpath声明数据卷
USERusername指定容器运行的用户名
WORKDIRpath指定容器的工作目录
ARGname设置构建时的参数
ONBUILDcommand当镜像被用作其他镜像的基础镜像时执行的命令

构建镜像

docker 使用 dockerfile 构建镜像的命令格式为:

docker build [选项] <上下文路径/URL/->
docker build [选项] <上下文路径/URL/->

其中上下文路径为 Dockerfile 文件所在路径。

TIP

其中上下文路径并不是 Dockerfile 文件所在路径,而是上下文路径

当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

因为有了上下文路径,我们才能在 ADDCOPY 命令中,获取到需要打包的文件路径。

示例:

dockerfile
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

Dockerfile 文件所在目录,执行以下命令,将使用当前目录下的 Dockerfile 文件构建一个 nginx 镜像,版本为 v3:

bash
docker build -t nginx:v3 .
docker build -t nginx:v3 .