【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.mzph.cn/news/680468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式大厂面试题(1)—— CVTE

从本篇开始将会更新历年来各个公司的面试题与面经&#xff0c;题目来自于网上各个平台以及博主自己遇到的&#xff0c;如果大家有所帮助&#xff0c;帮忙点点赞和关注吧&#xff01; 岗位&#xff1a;嵌入式软件工程师。 面试时间&#xff1a;20分钟。 面试 1 、简历中写了做过…

Kafka 入门笔记

课程地址 概述 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff09; 发布/订阅&#xff1a;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接受感兴趣的消息 消息队列 消息队…

HCIA-Datacom实验指导手册:4.3 实验三:网络地址转换配置实验

HCIA-Datacom实验指导手册&#xff1a;4.3 实验三&#xff1a;网络地址转换配置实验 一、实验介绍&#xff1a;二、 思考题与附加内容 一、实验介绍&#xff1a; NAT的作用&#xff1a; 1、很大程度提高网络安全性。 2、控制内外网网络联通性问题。 特点&#xff1a; 1&#…

JDK 11 vs JDK 8:探索Java的新特性和改进

随着技术的不断进步&#xff0c;Java开发工具包&#xff08;JDK&#xff09;也在不断演变&#xff0c;为开发者带来更高效、更安全的编程体验。在这篇文章中&#xff0c;我们将重点探讨JDK11相较于JDK 8所引入的一些新特性和改进&#xff0c;以便您能够更好地了解Java的最新发展…

leetcode:买卖股票最佳时机二

思路&#xff1a; 使用贪心算法&#xff1a;局部最优是将买卖过程中产生的正数进行相加&#xff0c;进而使得最后结果最大&#xff08;全局最优&#xff09;。 price [7,1,5,10,3,6,4] -6,4,5,-7,3,-2 正数相加就得到了最大 代码实现&#xff1a; 1.循环中下标从1开始 …

大数据的基础探索之大数据时代

前言&#xff1a;大数据已经是大势所趋&#xff0c;在这个网络时代能够不断地整合资源的人本身也是一种能力拥有者&#xff0c;在这个时代&#xff0c;如果一个人可以掌握数据分析工具&#xff0c;利用好云计算的能力&#xff0c;对于自己的个人而言来说都是一个极其重要的参与…

【PyTorch】张量(Tensor)的生成

PyTorch深度学习总结 第一章 Pytorch中张量(Tensor)的生成 文章目录 PyTorch深度学习总结一、什么是PyTorch&#xff1f;二、张量(Tensor)1、张量的数据类型2、张量生成和信息获取 总结 一、什么是PyTorch&#xff1f; PyTorch是一个开源的深度学习框架&#xff0c;基于Python…

20240212请问如何将B站下载的软字幕转换成为SRT格式?

20240212请问如何将B站下载的软字幕转换成为SRT格式&#xff1f; 2024/2/12 12:47 百度搜索&#xff1a;字幕 json 转 srt json srt https://blog.csdn.net/a_wh_white/article/details/120687363?share_token2640663e-f468-4737-9b55-73c808f5dcf0 https://blog.csdn.net/a_w…

上位机图像处理和嵌入式模块部署(利用python开发软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 开发windows和linux软件的时候&#xff0c;大家一般都是习惯于用c/c语言进行开发&#xff0c;但是目前来说很多的开发板都是支持python语言开发的。…

RK3588平台开发系列讲解(视频篇)RKMedia 数据流向

文章目录 一、 获取RKMedia模块通道中的数据二、RKMedia的数据源和接收者三、模块通道绑定API调用 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;RKMedia是RK提供的一种多媒体处理方案&#xff0c;可实现音视频捕获、音视频输…

服务治理中间件-Eureka

目录 简介 搭建Eureka服务 注册服务到Eureka 简介 Eureka是Spring团队开发的服务治理中间件&#xff0c;可以轻松在项目中&#xff0c;实现服务的注册与发现&#xff0c;相比于阿里巴巴的Nacos、Apache基金会的Zookeeper&#xff0c;更加契合Spring项目&#xff0c;缺点就是…

前端vue 数字 字符串 丢失精度问题

1.问题 后端返回的数据 是这样的 一个字符串类型的数据 前端要想显示这个 肯定需要使用Json.parse() 转换一下 但是 目前有一个问题 转换的确可以 showId:1206381711026823172 有一个这样的字段 转换了以后 发现 字段成了1206381711026823200 精度直接丢了 原本的数据…

MySQL监控Innodb信息

Innodb监控 Innodb由于支持事务操作&#xff0c;是mysql中使用最多的存储引擎&#xff0c;所以如何监控Innodb存储引擎以进行性能优化是在使用mysql过程中遇到最多的&#xff0c;那么如何进行监控呢&#xff1f; show engine -- 显示innodb存储引擎状态的统计和配置信息show en…

MogaNet实战:使用MogaNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2211.03295.pdf 作者多阶博弈论交互这一全新视角探索了现代卷积神经网络的表示能力。这种交互反映了不同尺度上下文中变量间的相互作用效…

C语言函数指针实现函数参数化

之前学习了基本的函数指针;函数指针有多种用途;下面看一下函数参数化; 函数参数化是指通过函数指针将函数的某些行为参数化。这样可以在调用函数时动态地指定函数的行为。 新建一个单文档工程;下述增加的函数声明加到视类cpp文件的头部,函数体加到视类cpp文件的尾部,在…

时域和离散域的重要转换器

自然界的模拟信号都是连续信号&#xff0c;也就是我们常说的时域信号&#xff0c;而我们的计算机只能处理离线的数字量信号&#xff0c;但是我们的闭环控制系统都是由离散域和时域所组成的&#xff0c;这里的离散域包括我们的计算机微控制器&#xff0c;时域包括我们的被控对象…

2024.2.3 作业

1、实现单向循环链表的头插头删尾插尾删 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef int datatype; typedef struct node {//数据域int data;//指针域struct node *next; }*Linklist; Linklist create() {Linklist s(Linklist)mallo…

linux应用 进程间通信之信号量(POSIX)

1、前言 1.1 定义 POSIX信号量是一种用于同步进程之间对共享资源访问的机制。它允许进程在访问共享资源之前进行互斥和同步操作&#xff0c;以确保数据的一致性和正确性。POSIX信号量通常由一个整数值表示&#xff0c;可以进行原子增减操作&#xff0c;以及等待和通知操作。 …

【Python网络编程之DHCP服务器】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之DHCP服务器 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2.1 D…

线性时间非比较类排序之计数排序

计数排序 计数排序由 HaroldH.Seward 于1954年提出&#xff0c;它是一种非基于比较的排序算法&#xff0c;通过辅助数组来确定各元素的最终位置。因为在排序过程中不存在元素之间的比较和交换操作&#xff0c;所以当待排序数组为整数且数组内数据的范围较小时&#xff0c;其优…