6.Dockerfile及Dockerfile常用指令

Dockerfile是构建docker镜像的脚本文件

Dockerfile有很多的指令构成,指令由上到下依次运行。

每一条指令就是一层镜像,层越多,体积就越大,启动速度也越慢

井号开头的行是注释行。指令写大写写小写都行,但一般都写为大写。每一行中间都可以有若干空行

在有的github项目中会给你Dockerfile,以便你能更方便的配环境

可以使用docker build将Dockerfile构建为镜像,命令为 docker build -t [镜像名称] .

  • 关于docker build的详细使用方法在 4.docker镜像及相关命令 有提到

目录

1  引用 FROM

2  复制 ADD

3  复制 COPY

4  定义维护者信息 MAINTAINER

5  定义元数据 LABEL

6  定义工作目录 WORKDIR

7  定义变量 ENV

8  执行命令 RUN

9  打开容器后执行的语句 CMD

9.1  ls命令简介

9.2  中括号写法

9.2.1  多个参数

9.2.2  参数和值

9.3  直接写

9.4  CMD给ENTRYPOINT提供参数

10  打开后容器执行的语句 ENTRYPOINT

11  定义变量 ARG

12  子镜像中要做的事情 ONBUILD

12.1  镜像的父子关系

12.2  简单使用

13  准备暴露的端口 EXPOSE

14  挂载数据卷 VOLUME

14.1  中括号

14.1.1  直接启动

14.1.2  加-v启动

14.2  直接写


1  引用 FROM

FROM是引用基础镜像,基础镜像就是官方或者别的做好的,我们一般站在巨人的肩膀上添加新的功能

在hello world的例子中,hello world的镜像就是基于scratch镜像的再创作

  • 默认情况下FROM会先从本地拉取,如果本地没有就会到源拉取

scratch是空的镜像,相当于面向对象编程中的基类。scratch只在Dockerfile中继承,不能通过pull拉取,不能run,没有tag

镜像不必须带FROM,不带FROM的镜像叫做基础镜像。比如scratch镜像的第一句就不是FROM scratch

我们自己写Dockerfile的时候基本都要带FROM,在别人的镜像上就行修改

FROM引用的是旧层,不产生新层

2  复制 ADD

ADD不太好用,还是用COPY要更好用一点

从Dockerfile文件所在的机器 复制文件到 镜像中。在hello world的例子中是将 hello 这个可执行文件(这里用的是相对路径[相对路径指的是相对Dockerfile文件的路径],也可以使用绝对路径),复制到镜像的 / 位置(根路径)

使用ADD指令,如果将可执行文件hello替换成一个压缩文件,压缩文件复制到容器后会自动解压

使用ADD指令,如果将可执行文件hello替换成一个url,url会自动下载到容器的指定目录中(相当于wget)

如果将可执行文件hello替换成一个文件夹(文件夹最后必须要加上斜杠),那么就会将文件夹中所有内容复制到容器的指定位置

3  复制 COPY

COPY的功能与ADD相似,同样是从Dockerfile文件所在的机器 复制文件到 镜像中。

与ADD的区别为

  • 使用COPY从复制压缩包后不会自动解压
  • 使用COPY不能复制url

4  定义维护者信息 MAINTAINER

  • 官方不建议使用MAINTAINER指令,但一些老的Dockerfile中会有MAINTAINER,能看懂就行

实际就是写创作者的名字,我简单做个例子

然后我们build一下

build之后可以看到MAINTAINER写的内容

5  定义元数据 LABEL

LABEL写什么东西都可以,我们简单做个例子

查看元数据的时候发现Author并没有被覆盖

而是把LABEL的内容都写在Labels中了

每个镜像层都由 镜像文件系统 和 镜像json文件 两部分构成。LABEL命令虽然没有改变镜像文件系统,但是改变了镜像的json文件,所以LABEL也会产生新的一层

6  定义工作目录 WORKDIR

我们创建一个ubuntu的容器,然后开启容器,发现工作目录默认在 / 这个位置

我们可以更改操作目录,比如我们想将工作目录搞到 /home 下

进入后发现工作目录是/home

WORKDIR可以写多个,比如我这样写,那么进去后的目录就为/usr/local。相当于后面是前面的相对路径,而不是覆盖掉前面的路径

7  定义变量 ENV

还是改变工作目录,这次我们用变量的形式来搞。ENV定义变量,后面使用$来调用变量

可以成功调用变量

同一行可以写多个,比如

8  执行命令 RUN

在ubuntu镜像中没有ifconfig这个命令,我现在想搞个有ifconfig的镜像

那么我们需要在镜像创建的时候就安装,需要执行一些命令

在构建的时候你就可以看到执行的过程

这样创建的镜像运行后就有ifconfig这个指令了

我们不建议RUN分多行写,因为这样会产生多层

我们可以把两行合起来写

这样这个RUN就只有一层了

如果比较长的话影响观感,可以这样分行来写

也可以用下面的语法来写,EXECUTABLE为可执行的东西,后面PARAM1,PARAME2是EXECUTABLE的参数

9  打开容器后执行的语句 CMD

9.1  ls命令简介

我们用ls来验证CMD,如果只输入ls,那么出现的结果是这样的

如果加入参数 -l 那么出现的结果是这样的,我们可以发现结果中有一些指向

如果再加入 -a,出现的结果是这样的。我们发现结果中出现了隐藏文件

9.2  中括号写法

9.2.1  多个参数

我们简单做个例子

发现结果中有指向,并且有隐藏文件,说明-l与-a生效了

9.2.2  参数和值

像ls这种-l,-a这种参数不加任何的值,有的参数可以加值,比如 /bin/bash 的-c参数,-c参数可以加命令,我们简单用一下

也可以在docker ps -a 中查看到运行的命令

从这里你就看出,相当于是只要空格你就写个逗号,然后凑个数组

9.3  直接写

我们简单写一下

可以通过docker ps -a看一下

9.4  CMD给ENTRYPOINT提供参数

第三种是提供给ENTRYPOINT的参数。如果CMD不是为ENTRYPOINT提供参数,那么不建议ENTRYPOINT与CMD同时出现

如果使用CMD给ENTRYPOINT添加参数,ENTRYPOINT必须为中括号的写法。我们简单用一下

  • CMD与ENTRYPOINT谁写前面谁写后面都行

发现可以达到效果

由于docker run的COMMAND这个参数本质上是覆盖CMD,所以可以在docker run中给ENTRYPOINT参数,比如

相当于把 -l -s 替换成了 -s

10  打开后容器执行的语句 ENTRYPOINT

与CMD的区别为CMD可以通过docker run 的参数替代,但是ENTRYPOINT不会被替代,也就是说运行容器后怎么都会执行一次ENTRYPOINT的内容

docker run可以定义CMD与参数,Dockerfile中的CMD也可以定义CMD与参数,但你不能用docker run的CMD配Dockerfile的参数,也不能用Dockerfile的CMD配docker run 的参数。比如你Dockerfile中有CMD,然后docker run中只给参数,这样是不对的

ENTRYPOINT本身两种写法,一种带中括号

一种不带中括号

用法与CMD一致,就不举例子了

ENTRYPOINT与CMD指令会将启动命令写在json文件中,改动了json文件从而会产生新的镜像层

11  定义变量 ARG

ENV的值不能被build的参数 --build-arg 覆盖,但是ARG可以

我们简单做个例子

build的时候发现这两个变量都可以调用

我们此时尝试对name与age这两个变量进行覆盖

发现name(ENV定义的变量)不能覆盖,age(ARG定义的变量)可以被覆盖

一个ARG命令只能定义一个变量,如果要定义多个变量需要多个ARG

12  子镜像中要做的事情 ONBUILD

12.1  镜像的父子关系

在helloworld的例子中,我们通过Dockerfile创建的helloworld镜像 的 父镜像 是 scratch。helloworld镜像称为scratch的子镜像

如果B镜像的Dockerfile通过FROM使用了helloworld镜像,那么B镜像为helloworld镜像的子镜像

12.2  简单使用

我现在Dockerfile内容如下

build之后run,发现ifconfig用不了

我们此时再搞一个如下的Dockerfile将其命名为son

然后build->run->ifconfig

发现可以使用,这个就可以证明 ONBUILD 不是构建自己镜像时候做的事情,而是构建子镜像做的事情

13  准备暴露的端口 EXPOSE

EXPOSE这个参数是给人看的,不是给机器看的。EXPOSE参数对生成镜像没有作用,暴露端口的时候依然要用 -p

我们简单用一下

14  挂载数据卷 VOLUME

VOLUME后接的是容器内的挂载点,可以是一个可以是多个

一般不使用VOLUME,因为使用VOLUME只能通过-v覆盖的方式自定义宿主机内的挂载点。

14.1  中括号

比如我在容器中创建 /home/A 和 /home/B 这两个挂载点

把上面的dockerfile创建为镜像

14.1.1  直接启动

我们先直接启动该镜像

然后查看这个镜像的信息

发现数据卷的位置默认在/var/lib这个里面

14.1.2  加-v启动

加-v会多一组数据卷,不会影响之前的

如果容器内的挂载点相同就会覆盖(不测了,一般不会这么干)

14.2  直接写

比如还是在容器中创建 /home/A与/home/B 这两个挂载点

之后创建镜像,创建容器,发现里面有A和B两个挂载点

宿主机的挂载点在 /var/lib/docker/volumes 中,里面长名字的文件夹,代表不同的挂载点。可以根据创建的时间大概推测出来新创建的容器挂载点是哪个。这里面有两个文件夹分别代表A和B,我们先选一个看一下

进入这个文件需要输入密码(包括之前进入 /var/lib/docker 这一级也需要密码)

现在这个里面是空的

这个时候我在A里面创建一个文件夹

刷新宿主机发现能同步

那么后面再找B的对应文件夹,估计是这个

在这里创建一个名为1的文件夹

发现可以同步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47152.shtml

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

相关文章

ubuntu上通过修改grub启动参数,将串口重定向到sol

要修改 GRUB 启动参数以实现串口重定向到 Serial Over LAN (SOL),你需要编辑 /etc/default/grub 文件,并更新 GRUB 配置。这里是详细步骤: 1. 编辑 /etc/default/grub 打开终端并使用文本编辑器(如 nano 或 vim)编辑…

介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者:来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始,我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常,该模型用作第二…

关于Flume和Flink

看起来都能处理实时数据 想象一下你家的厨房,Flume就像是那个负责把食材从冰箱里取出来、清洗干净、切好并准备好放在砧板上的厨师助手。而Flink则像是那个真正的主厨,他拿到准备好的食材,开始烹饪,加入调料,做出美味…

谈人工智能在电子档案系统的应用

引言 随着人工智能技术的飞速发展,其在电子档案系统中的应用正逐渐成为学术研究和实际应用的热点。本文旨在探讨人工智能在电子档案系统中的应用现状、优势以及面临的挑战,并展望未来的发展方向。通过分析当前档案管理面临的挑战,以及人工智…

nginx代理缓存

在服务器架构中,反向代理服务器除了能够起到反向代理的作用之外,还可以缓存一些资源,加速客户端访问,nginx的ngx_http_proxy_module模块不仅包含了反向代理的功能还包含了缓存功能。 1、定义代理缓存规则 参数详解: p…

PX4 1.14 Ubuntu22.04 ROS2 Humble 虚拟机镜像 下载

仿真测试视频: px4 ubuntu22.04 test 下载地址(付费内容,不能接受请勿下载): 链接:https://pan.baidu.com/s/1YTK4AQj7MRBo3-xX2s_76Q?pwdrmsg 提取码:rmsg

vue2使用g6,G6

1安装 cnpm install --save antv/g63.4.82、代码&#xff0c;简单使用 <template><div>3333<div id"mountNode"></div></div> </template> <script> import G6 from antv/g6 export default {data() {return {}},comput…

减分虎-交管12123学习题目及答案

学法减分是对驾驶证已经存在的记分进行减免&#xff0c;并不是给驾驶证进行加分&#xff0c;不是代替违章扣分。学法免费获取的分值正是对扣分记录的清除。比如违章被扣6分&#xff0c;通过学法免分考试把6分清空重新开始。 学法减分政策为驾驶员提供了一次难得的加分机会。然而…

WordPress 6.6 “Dorsey多尔西”发布

WordPress 6.6 “Dorsey多尔西”已经发布&#xff0c;它以传奇的美国大乐队领袖 Tommy Dorsey 名字命名。Dorsey 以其音调流畅的长号和作品而闻名&#xff0c;他的音乐以其情感深度和充满活力的能量吸引了观众。 当您探索 WordPress 6.6 的新功能和增强功能时&#xff0c;让您的…

MBR40150FCT-ASEMI无人机专用MBR40150FCT

编辑&#xff1a;ll MBR40150FCT-ASEMI无人机专用MBR40150FCT 型号&#xff1a;MBR40150FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;40A 最大循环峰值反向电压&#xff08;VRRM&a…

部署kafkamanager

1&#xff0c;检查kafka的版本 到lib下查看 libs/kafka-clients-0.11.0.3.jar kafka的版本 0.11 2&#xff0c;下载kafkamanager 链接&#xff1a; https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 3&#xff0c;解压后更改该conf下conf/application.conf 中zkhosts …

论文翻译 | Successive Prompting for Decomposing Complex Questions 分解复杂问题的连续提示

摘要 回答需要做出潜在决策的复杂问题是一项具有挑战性的任务&#xff0c;尤其是在监督有限的情况下。 最近的研究利用大型语言模型&#xff08;LMs&#xff09;的能力&#xff0c;在少量样本设置中通过展示如何在单次处理复杂问题的同时输出中间推理过程&#xff0c;来执行复杂…

2024年金航标和萨科微扩张

近年电子信息产业链的外迁和世界经济的低迷&#xff0c;各行各业都很卷&#xff0c;加班加点但业绩负增长是常态&#xff0c;互联网大厂阿里巴巴大裁员、字节跳动裁到了大动脉、京东刘强东抛弃躺平的兄弟、深圳华强北做电子元器件的老板老板娘们一脸茫然&#xff0c;周围都弥漫…

2024华为数通HCIP-datacom最新题库(变题更新⑥)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

【数据表的类型】

MYISAMINNODB事务支持不支持支持数据行锁定不支持支持外键约束不支持支持全文索引支持不支持表空间的大小较小较大&#xff0c;约为MYISAM的2倍 常规使用操作 MYISAM节约空间&#xff0c;速度较快 INNODB安全性较高&#xff0c;事务的处理&#xff0c;多表多用户操作 在物理…

人工智能在软件开发中的崭新角色:助力还是取代?

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其在软件开发领域的应用日益广泛&#xff0c;引发了开发者们对未来职业前景和技能需求变化的深刻思考。 传统上&#xff0c;软件开发是一项高度创造性和复杂的任务&#xff0c;但随着生成式人工智能&#xff…

CSI-2介绍

CSI-2介绍 1.CSI-2是什么2.CSI-2功能简述3.分层传输3.1应用层&#xff08;Application Layer&#xff09;3.2协议层&#xff08;Protocol Layer&#xff09;3.3物理层&#xff08;PHY Layer&#xff09; 4.支持传输数据类型5.版本5.1、CSI-2 1.05.2、CSI-2 2.0 6.框图6.1CSI2&a…

【手写数据库内核组件】0501多线程并发模型,任务分发多工作者执行架构实现,多线程读写状态时volatile存储类型使用技巧

0501 多线程管理 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 0501 多…

微信小程序加载动画文件

最近在做微信小程序的动画&#xff0c;调研了几种方案 PAG 腾讯自家的&#xff0c;分为完整版和lite版&#xff0c;对于矢量动画挺好的&#xff0c;但是位图会有问题 完整版会逐渐卡死&#xff0c;lite虽然不会卡死&#xff0c;但是很模糊&#xff0c;优点是动画文件很的很小。…

Linux 多进程编程详解

Linux 多进程编程详解 多进程编程是现代操作系统中一种重要的并发编程技术。通过在同一程序中运行多个独立的进程&#xff0c;可以实现并发处理&#xff0c;充分利用多核处理器的优势&#xff0c;提高程序的运行效率。本文将详细介绍Linux多进程的基本概念、创建方法、进程间通…