【Docker进阶】镜像制作-用Dockerfile制作镜像(一)

进阶一 · docker镜像制作


文章目录

dockerfile制作镜像

用快照制作镜像的缺陷:

  • 黑盒
  • 不可重复
  • 臃肿

dockerfile是什么

镜像的定制实际上就是定制每一层所要添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是dockerfile

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

dockerfile格式

如果行开头是#,那么这一行表示注释,如果#出现在其他地方,这个#都被视为参数。

指令一般写成大写(虽然大小写都可以),但是为了和参数作区分,我们一般就用大写。

简单dockerfile例子:

dockerfile 复制代码
FROM ubuntu:20.04
ADD run.sh /
CMD ["/run.sh"]

为什么需要dockerfile

  • 可以按照需求自定义镜像
    • 和docker commit一样能够自定义镜像,官方的镜像可以说很少能直接满足我们应用的,都需要我们自己打包自己的代码然后做成对应的应用镜像对外使用。
  • 很方便的自动化构建,重复执行
    • 通过dockerfile可以自动化的完成镜像的构建,而不是像docker commit一样,手动一个命令一个命令执行,而且可以重复执行,docker commit都话很容易忘记执行了哪个命令,哪个命令没有执行
  • 维护修改方便,不再是黑箱操作
    • 使用docker commit意味着对所有镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,dockerfile很容易二次开发
  • 更加标准化,体积可以做的更小
    • docker容器启动之后,系统运行会生成很多运行时的文件,如果使用docker commit

Dockerfile指令集合

指令的官方文档:https://docs.docker.com/engine/reference/builder/

指令 功能
FROM 构建镜像是基于哪个镜像,也就是基础镜像
MAINTAINER 镜像维护者的姓名或者邮箱地址(已经废弃,被label替代了)
LABEL 为镜像添加元数据
COPY 拷贝文件或者目录到镜像中,跟ADD类似,但不具备自动下载或者解压的功能
ADD 拷贝文件或目录到镜像中,如果是URL或者压缩包便会自动下载或自动解压
WORKER 指定工作目录
RUN 指定docker build过程中运行的程序
VOLUME 指定容器挂载点
EXPOSE 声明容器的服务端口(仅仅是声明)
ENV 设置环境变量
CMD 运行容器时执行的命令
ENTRYPOINT 运行容器时程序入口
ARG 指定构建时的参数
SHELL 指定采用哪个shell(使用较少)
USER 指定当前用户
HEALTHCHECK 健康检测指令
ONBUILD 在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行(使用较少)
STOPSIGNAL 允许您覆盖发送到容器的默认信号(使用较少)

FROM

FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境。

注意事项:

  • FROM 指令必须是 Dockerfile 中非注释行或者 ARG 之后的第一个指令。

  • 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build 会在docker 主机上查找指定的镜像文件,在其不存在时,则会自动从 Docker 的公共库 pull 镜像下来。如果找不到指定的镜像文件,docker build 会返回一个错误信息。

  • FROM 可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像,或将一个构建阶段作为另一个的依赖。

  • 如果 FROM 语句没有指定镜像标签,则默认使用 latest 标签。

语法:

dockerfile 复制代码
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

参数:

  • <platform>:构建的cpu架构,如 linux/amd64, linux/arm64, windows/amd64
  • <image>:指定作为 base image 的名称
  • <tag>:base image 的标签,省略时默认 latest)
  • <digest>:是镜像的哈希码
  • AS <name>:指定构建步骤的名称,配合 COPY --from=<name>可以完成多

MAINTAINER

功能:

  • 用于让dockerfile制作者提供本人的详细信息
  • 该功能已经废弃,由label替代

语法:

dockerfile 复制代码
MAINTAINER <author's detail>

样例:

dockerfile 复制代码
MAINTAINER "yufc <yufc@xx.com>"

使用例子:

LABEL

功能:

为镜像添加元数据,元数据是kv对的形式。

语法:

dockerfile 复制代码
LABEL <key>=<value> <key>=<value> <key>=<value> ...

样例:

COPY

功能:

  • 用于从docker主机赋值新文件或者目录至创建的新镜像的指定路径中。
dockerfile 复制代码
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

参数:

  • <src>:要复制的源文件或目录,支持使用通配符
  • <dest>:目标路径,即正在创建的image的文件系统路径,建议<dest>使用绝对路径,否则,COPY指定以WORKDIR为当前路径

在路径中有空白字符时,通常使用第二种格式。

  • --chown:修改用户和组
  • --from<name>:可选项。可以从之前构建的步骤中拷贝内容,结合FROM ... AS <name>往往用作多级构建,后续我们有实战课专门完成多级构建

注意事项:

  • <src>必须是build上下文中的路径,不能是其父目录中的文件。
  • 如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制。
  • 如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以'/'结尾。
  • 如果<dest>事先不存在,它将会被自动创建,这包括父目录路径。

例子一:

例子二:

发现镜像里面已经有一个叫news的用户和一个叫news的组。

ENV

功能:

  • 用于为镜像定义所需的环境变量,并可以被Dockerfile文件中位于其后的其他指令(如ENV,ADD,COPY等)所调用
  • 调用格式为$variable_name${variable_name}

语法:

dockerfile 复制代码
ENV <key>=<value>

案例:

WORKDIR

功能:

  • 为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY和ADD设定工作目录

语法:

dockerfile 复制代码
WORKDIR /path/to/workdir

注意事项:

  • 默认的工作目录是/
  • 如果提供了相对路径,它将相对于前一条WORKDIR指令的路径
  • WORKDIR指令可以解析先前使用设置的环境变量ENV

样例:

相关推荐
景天科技苑2 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge3 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇3 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试5 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!11 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林12 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis14 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision14 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge14 小时前
Docker篇(Docker Compose)
运维·docker·容器
北漂IT民工_程序员_ZG15 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes