首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Docker 镜像构建保姆级入门实战指南

一、概述

是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

官方文档:

https://docs.docker.com/engine/reference/builder/

Dockerfile 示例:

https://github.com/dockerfile/

二、Dockerfile 结构

Dockerfile 结构主要分为四部分:

基础镜像信息

维护者信息

镜像操作指令

容器启动时执行指令 (CMD/ENTRYPOINT)微信搜索公众号:Linux技术迷,回复:linux 领取资料 。

【温馨提示】Dockerfile 每行支持一条指令,每条指令可携带多个参数(支持&&),支持使用以“#“号开头的注释(jason 文件不支持#注释),但是也非必须满足上面的四点。

三、常用 Dockerfile 操作指令

—— 定义创建镜像过程中使用的变量 ,唯一一个可以在 FROM 之前定义 。

——基于某个镜像, 前面只能有一个或多个指令 。

(已弃用) —— 镜像维护者姓名或邮箱地址 。

—— 指定容器挂载点到宿主机自动生成的目录或其他容器

——执行镜像里的命令,跟在 liunx 执行命令一样,只需要在前面加上 RUN 关键词就行。

——复制本地(宿主机)上的文件到镜像。

——复制并解压(宿主机)上的压缩文件到镜像。

——设置环境变量。

—— 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录 。

—— 为 RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户。

—— 声明容器的服务端口(仅仅是声明) 。

—— 容器启动后执行的命令 ,多个 CMD 只会执行最后一个,跟 ENTRYPOINT 的区别是,CMD 可以作为 ENTRYPOINT 的参数,且会被 yaml 文件里的 command 覆盖。

—— 容器启动后执行的命令 ,多个只会执行最后一个。

—— 健康检查 。

——它后面跟的是其它指令,比如 ,  等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

——LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式 ,替换 MAINTAINER。

1)镜像构建(docker build)

2)运行容器测试(docker run)

3)ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。唯一一个可以在 FROM 之前定义 。构建命令 docker build 中可以用 --build-arg = 来覆盖。

语法格式:

示例:

4)FROM

定制的镜像都是基于 FROM 的镜像 ,【必选项】

语法格式:

如果引用多平台图像,可选标志可用于指定图像的平台。例如,、 或。默认情况下,使用构建请求的目标平台。全局构建参数可用于此标志的值,例如允许您将阶段强制为原生构建平台 ( ),并使用它交叉编译到阶段内的目标平台。

示例:

5)MAINTAINER(已弃用)

镜像维护者信息

语法格式:

示例:

6)VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

避免重要的数据,因容器重启而丢失,这是非常致命的。

避免容器不断变大。

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

语法格式:

示例:

7)RUN

用于执行后面跟着的命令行命令。

语法格式:

(shell形式,命令在 shell 中运行,默认在 Linux 或Windows 上)

(执行形式)

示例:

8)COPY

拷贝(宿主机)文件或目录到容器中,跟 ADD 类似,但不具备自动下载或解压的功能 。所有新文件和目录都使用 0 的 UID 和 GID 创建,除非可选标志指定给定的用户名、组名或 UID/GID 组合以请求复制内容的特定所有权。

语法格式:

示例:

9)ADD

拷贝文件或目录到容器中,如果是 URL 或压缩包便会自动下载或自动解压 。

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

ADD 的优点:在执行 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 。

ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

语法格式:

示例:

ADD 和 COPY 的区别和使用场景:

ADD 支持添加远程 url 和自动提取压缩格式的文件,COPY 只允许从本机中复制文件

COPY 支持从其他构建阶段中复制源文件(--from)

根据官方 Dockerfile 最佳实践,除非真的需要从远程 url 添加文件或自动提取压缩文件才用 ADD,其他情况一律使用 COPY

10)ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

语法格式:

示例:

11)WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

语法格式:

示例:

12)USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

语法格式:

示例:

13)EXPOSE

暴露端口 ,仅仅只是声明端口。

作用:

帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。

在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

语法格式:

示例:

14)CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:CMD 在构建镜像时不会执行,在容器运行 时运行。

语法格式:

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

示例:

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

15)ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。在 k8s 中 command 也会覆盖 ENTRYPOINT 指令指定的程序

语法格式:

示例:

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

16)HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

语法格式:

选项有:

(默认:):间隔,频率

(默认:):超时时间

(默认:):为需要时间引导的容器提供初始化时间, 在此期间探测失败将不计入最大重试次数。

(默认:):重试次数

命令的指示容器的运行状况。可能的值为:

0:健康状态,容器健康且已准备完成。

1:不健康状态,容器工作不正常。

2:保留,不要使用此退出代码。

示例:

17)ONBUILD

是一个特殊的指令,它后面跟的是其它指令,比如 ,  等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

语法格式:

示例:

18)LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式。用来替代 MAINTAINER。

语法格式:

示例:比如我们可以添加镜像的作者

四、ARG 和 ENV 的区别

ARG 定义的变量只会存在于镜像构建过程,启动容器后并不保留这些变量

ENV 定义的变量在启动容器后仍然保留

五、CMD,ENTRYPOINT,command,args 场景测试

当用户同时在 kubernetes 中的 yaml 文件中写了和的时候,默认是会覆盖中的命令行和参数,完整的情况分类如下:

1)command 和 args 不存在场景测试

如果 command 和 args 都没有写,那么用默认的配置。

Dockerfile

/tmp/test.sh

构建

yaml 编排

执行

2)command 存在,但 args 存在场景测试

如果 command 写了,但 args 没有写,那么 Docker 默认的配置会被忽略而且仅仅执行文件的 command(不带任何参数的)。

3)command 不存在,但 args 存在场景测试

如果 command 没写,但 args 写了,那么 Docker 默认配置的 ENTRYPOINT 的命令行会被执行,但是调用的参数是中的 args,CMD 的参数会被覆盖,但是 ENTRYPOINT 自带的参数还是会执行的。

4)command 和 args 都存在场景测试

如果如果 command 和 args 都写了,那么 Docker 默认的配置被忽略,使用的配置。

镜像构建 Dockerfile 的介绍就到这里了。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OkEi1wnTmj79lwmv92da-ILg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券