当前位置: 首页 > news >正文

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

在这里插入图片描述

进阶一 · docker镜像制作


文章目录

  • 进阶一 · docker镜像制作
    • 用`dockerfile`制作镜像
      • dockerfile是什么
      • dockerfile格式
      • 为什么需要dockerfile
      • Dockerfile指令集合
      • FROM
      • MAINTAINER
      • LABEL
      • COPY
      • ENV
      • WORKDIR

dockerfile制作镜像

用快照制作镜像的缺陷:

  • 黑盒
  • 不可重复
  • 臃肿

dockerfile是什么

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

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

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 标签。

语法:

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替代

语法:

MAINTAINER <author's detail>

样例:

MAINTAINER "yufc <yufc@xx.com>"

使用例子:

LABEL

功能:

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

语法:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

样例:

COPY

功能:

  • 用于从docker主机赋值新文件或者目录至创建的新镜像的指定路径中。
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}

语法:

ENV <key>=<value>

案例:

WORKDIR

功能:

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

语法:

WORKDIR /path/to/workdir

注意事项:

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

样例:

http://www.lryc.cn/news/300573.html

相关文章:

  • 数据密集型应用系统设计
  • 分布式文件系统 SpringBoot+FastDFS+Vue.js【一】
  • 【PyQt】11-QTextEdit、QPushButton
  • 初识webpack(二)解析resolve、插件plugins、dev-server
  • 什么是自编码器Auto-Encoder?
  • openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络
  • SAP PP学习笔记- 豆知识01 - 怎么查询既存品目
  • 相机的机身马达有什么用?
  • 拿捏c语言指针(上)
  • JVM指令手册
  • Linux之多线程
  • TestNG invocationCount属性
  • 关于maven项目中无法通过邮件服务器发送邮件的补充解决方案
  • 树形dp 笔记
  • 2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏
  • typescript中的Omit排除类型及Pick取想要的属性
  • MATLAB计算极限和微积分
  • 在数组中插入元素
  • 【计算机网络】物理层|传输介质|物理层设备|宽带接入技术
  • TCP和UDP面试题提问
  • 网安常用的三个攻击方式
  • C++面向对象程序设计-北京大学-郭炜【课程笔记(二)】
  • IDEA Ultimate下载(采用JetBrain学生认证)
  • Matplotlib plt.plot数据可视化应用案例
  • ES实战--集群扩展
  • 【重要】django默认生成的表的意思记录
  • 12.3 OpenGL顶点后处理:平面着色
  • 实验5-6 使用函数判断完全平方数
  • AI 或许真的能助力中产阶级重塑辉煌 [译]
  • C#利用接口实现选择不同的语种