【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,一经查实,立即删除!

相关文章

Kafka 入门笔记

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

leetcode:买卖股票最佳时机二

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

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 精度直接丢了 原本的数据…

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

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

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

自然界的模拟信号都是连续信号&#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;其优…

计算x的平方根x含负数和复数cmath.sqrt(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算x的平方根 x含负数和复数 cmath.sqrt(x) cmath.sqrt(-4)输出的结果是&#xff1f; import cmath import math a 4 print("【显示】a ",a) print("【执行】math.sqrt(a)&…

有状态DHCPv6快速模式配置及EUI-64介绍

正文共&#xff1a;1024 字 15 图&#xff0c;预估阅读时间&#xff1a;3 分钟 我们现在已经熟悉了IPv6的地址架构&#xff08;IPv6地址架构一本通&#xff09;&#xff0c;掌握了IPv6地址的手工配置方式&#xff08;IPv6从入门到精通&#xff09;和DHCPv6有状态地址配置&#…

openssl3.2 - osslsigncode工程的学习

文章目录 openssl3.2 - osslsigncode工程的学习概述笔记工程库地址工程的编译osslsigncodeM工程文件列表osslsigncodeM工程搭建细节原始工程实现的改动自己封装的包含openssl和curl的实现osslsigncodeM工程命令行的用法备注 - VS2019调试环境备注 - 如果要单步openssl的API学学…

第六篇:MySQL图形化管理工具

经过前五篇的学习&#xff0c;对于数据库这门技术的理解&#xff0c;我们已经在心中建立了一个城堡大致的雏形&#xff0c;通过命令行窗口&#xff08;cmd&#xff09;快速上手了【SQL语法-DDL-数据定义语言】等相关命令 道阻且长&#xff0c;数据库技术这一宝藏中还有数不清的…

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…

N1CTF奖品一个月的ZoomEye账户使用与子域名收集(网络渗透测)

首页 - 网络空间测绘,网络安全,漏洞分析,动态测绘,钟馗之眼,时空测绘,赛博测绘 - ZoomEye("钟馗之眼")网络空间搜索引擎https://www.zoomeye.org/ZoomEye - Cyberspace Search Enginehttps://www.zoomeye.org/aboutZoomEye&#xff08;“钟馗之眼”&#xff09;是知道…

幻兽帕鲁游戏官方更新了版本,联机时提示版本不适用,无法加入,怎么办?

如果你在登录游戏的时候提示&#xff1a;您正在尝试加入的比赛正在运行不兼容的游戏版本。请尝试升级游戏版本。此时就说明你需要更新部署在服务器内的幻兽帕鲁了。 1、如果你使用幻兽帕鲁应用模板部署游戏&#xff0c;那么可以选择使用游戏配置面板一键更新。 2、如果你使用一…