【还不了解 Dockerfile 的同学不是好测试人】

近年来 Docker 非常火,想要玩好 Docker 的话 Dockerfile 是绕不开的,这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。

今天我们就来聊一聊 Dockerfile 怎么写,那些指令到底是什么意思。

一、先来看一个简单的 Dockerfile

#这个Dockerfile作用是打一个python3项目环境FROM python:3-alpineWORKDIR /appADD . /appRUN pip3 install -r requirements.txt -i https://pypi.douban.com/simpleCMD ["python3", "main.py"]#这个Dockerfile作用Dockerfile部署django项目FROM centos:7MAINTAINER hailiADD requeriments.txt /homeWORKDIR /homeRUN yum update && yum -y install mysql && yum -y install python3-pip && pip3 install -r requirements.txt ADD autoTest /home/WORKDIR /home/autoTestEXPOSE 8000ENTRYPOINT uwsgi --ini uwsgi.ini

二、Dockerfile 编写规则

  1. 指令大小写不敏感,为了区分习惯上用大写

  2. Dockerfile 非注释行第一行必须是 FROM

  3. 文件名必须是 Dockerfile

  4. Dockerfile 指定一个专门的目录为工作空间

  5. 所有引入映射的文件必须在这个工作空间目录下

  6. Dockerfile 工作空间目录下支持隐藏文件(.dockeringore)

  7. (.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录

  8. 每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条

三、Dockerfile 指令详解
1.FROM:基础镜像

 1.1、FROM是Dockerfile文件开篇第一个非注释行代码 1.2、用于为镜像文件构建过程指定基础镜像,后续的指令都基于该基础镜像环境运行 1.3、基础镜像可以是任何一个镜像文件 1.4、docker build 会在docker宿主机上查找指定的文件,如未找到会自动去Docker Hub Registry上拉取 1.5、如果没找到对应的镜像就会返回错误信息

2.MAINTAINER:镜像作者信息

2.1、废弃了,使用LABLE替代

3.LABLE:镜像描述信息

3.1、LABLE author="haili"

4.COPY:从 Docker 宿主机复制文件至创建的新镜像文件

4.1、COPY <src> <dest>4.2、COPY ["<src>",.... "<dest>"]4.3、<src>:要复制的源文件或目录,支持使用通配符     1、<src>必须是build上下文中的路径,不能是其父目录路径     2、如果<src>是目录,则其内部文件和子目录都会被递归复制,但是<src>目录本身不会被复制     3、如果指定了多个<src>,或者<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾4.4、<dest>:目标路径,即正在创建的images的文件系统路径     1、建议使用绝对路径,否则COPY指定以WORKDIR为其实路径     2、如果<dest>不存在,将会被自动创建,包括其父目录路径一起创建4.5、复制文件     COPY testFile /mnt4.6、复制目录     COPY testDir /mnt/testDir     1、testDir下所有文件和目录都会被递归复制     2、目标路径要写testDir,否则会复制到/mnt下

5.ADD:类似于 COPY 指令,ADD 支持 tar 文件和 URL 路径

​​​​​​​​​​​​​​

5.1、ADD <src> <dest>5.2、ADD ["<src>",.... "<dest>"]5.3、如果<src>为URL切<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<fimename>,如果<dest>以/结尾,则文件名URL指定的文件将被下载并保存为<dest>/fimename5.4、如果<src>是一个压缩文件(tar),会被解压为一个目录,但是通过URL下载的tar文件不会被解压5.5、如果是多个<src>,或者是同一个<src>使用了通配符,则<dest>必须是以/结尾的目录,如果<dest>不以/结尾,则<src>会被作为一个普通文件,<src>内容讲被写入到<dest>

6.WORKDIR:用于为 Dockerfile 中所有的 RUN、CMD、ENTRYPOINT、COPY、ADD 指定设定工作目录

​​​​​​​

6.1、WORKDIR /mnt,如果目录不存在会自动创建,包括他的父目录6.2、一个Dockerfile中WORKDIR可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR路径6.3、WORKDIR也可以调用ENV指定的变量6.4:举例     from python:latest     workdir /mnt     run touch a.txt     workdir /usr     run touch b.txt

7.VOLUME:数据卷,用于在 image 中创建挂载点目录,以挂载 Docker host 上的卷或者其他容器上的卷

​​​​​​​

7.1、VOLUM mount_point7.2、VOLUM ["mount_point1","mount_point2"]7.3、如果挂载点目录下有文件存在,docker run命令会在卷挂载完成后将所有文件复制到容器中

8.EXPOSE:为容器打开指定的监听端口以实现与外部通信

​​​​​​​

8.1、EXPOSE <port> </portocol>     1、<port>:端口号     2、</portocol>:协议类型,默认为TCP协议     EXPOSE 8080/tcp 8081/udp8.2、不会直接对外暴露这里的端口,只有在run的时候加上-P(大写)才会将EXPOSE的端口暴露出去

9.ENV:用于为镜像定义所需的环境变量,可以被 Dockerfile 文件中其他命令调用(ENV、ADD、COPY、RUN、CMD)

​​​​​​​

9.1、ENV key value     1、key之后的所有内容都会被视为value,因此,一次只能设置一个变量 9.2、ENV key=value     1、可以设置多个变量,每个key=value键值对为一个变量     2、如果value中包含空格需要用反斜杠转义,也可以对value加引号进行标识,反斜杠也可以用于续行9.3、调用格式:$variable_name 或 ${variable_name}9.4、定义多个变量建议使用第二种方式,以便在同一层中完成9.5、举例     ENV DOC_DIR=/mnt/doc     COPY index.html ${DOC_DIR:-/mnt/doc}      #-:如果DOC_DIR不存在则使用-后面的默认值     #+:如果DOC_DIR存在则使用+后面的值

10.RUN:docker build 镜像构建的时候需要执行的 shell 命令默认"/bin/sh -c"运行

​​​​​​​

10.1、docker build过程中需要执行的命令10.2、RUN是在镜像构建完成之后运行结束10.3、RUN执行的命令只能基于基础镜像的命令,执行之前先要确定基础镜像是否有该命令10.4、一个Dockerfile可以写多个RUN    语法一、RUN command1 && command2....            1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程          2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到          3、RUN echo "test_demo" > a.txt 此时可以使用shell特性    语法二、RUN ["executable","param1","param2"]          1、executable为要运行的命令          2、param1为命令运行的参数          3、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)          4、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程             RUN ["/bin/bash","-c","executable","param1"]          5、list中的参数要使用双引号

11.CMD:启动容器指定默认要运行的程序或命令,默认"/bin/sh -c"运行

​​​​​​​

11.1、docker run过程中需要执行的命令11.2、CMD运行结束后容器就将终止11.3、CMD指定的命令将可以被 docker run 最后面的命令覆盖11.4、一个Dockerfile写多个CMD只有最后一个CMD会生效    语法一、CMD command           1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程,能使用shell操作符           2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到           3、CMD /bin/httpd -f -h ${httpd}              此时在运行容器的时候加-it参数无法进入交互式模式,需要使用docker exec进入交互模式    语法二、CMD ["executable","param1","param2"]           1、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)           2、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程              CMD ["/bin/bash","-c","executable","param1","param2"](有问题,不能启动容器)    语法三、CMD ["param1","param2"]           1、需要结合ENTRYPOINT指令提供默认参数使用

12.ENTRYPOINT:类型 CMD 指令的功能,用于为容器指定默认运行程序或命令

​​​​​​​

1、与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序2、docker run命令的 --entrypoint选项参数可以覆盖ENTRYPOINT指令指定的程序3、一个Dockerfile中可以有多个ENTRYPOINT,但是只有最后一个会生效4、ENTRYPOINT主要用于shell作为启动其他进程的父进程,后面跟的参数被当成子进程来启动    语法一:ENTRYPOINT command    语法二:ENTRYPOINT  ["/bin/bash","param1","param2"]

13.CMD 和 ENTRYPOINT 同时存在 Dockerfile 中

​​​​​​​

1、CMD的值会当做参数传递给ENTRYPOINT2、实现使用shell子进程启动httpd3、如果docker run再传入参数,是传给ENTRYPOINT的,因为ENTRYPOINT有自己的参数,此时CMD参数会被ducker run后面跟的参数覆盖,并不是覆盖ENTRYPOINT的参数,要覆盖ENTRYPOINT的参数需要使用--entrypoint选项    CMD ["/bin/httpd/","-f"]    ENTRYPOINT /bin/bash -c -h    通过传参启动容器    FROM python:latest    LABLE auth="haili"    ENV NGX_DOC_ROOT='/data/web/html'    ADD entrypoint.sh /bin/    CMD ['/usr/sbin/nginx','-g','daemon off;']    ENTRYPOINT ['/bin/sh','-c','/bin/entrypoint.sh']    1、先执行ENTRYPOINT,然后讲CMD的值当做参数传给ENTRYPOINT进行执行

14.USER:指定运行 image 时和 Dockerfile 中任何 RUN、CMD、ENTRYPOINT 指令指定的程序的用户

​​​​​​​

1、使用用户名或者UID2、默认情况下container的运行身份为root用户3、USER UID | user_name4、UID 和 user_name必须存在/etc/passwd当中,否则会报错

15.HEALTHCHECK:健康检查,定义一个命令用于检查主进程工作状态是否健康

​​​​​​​

15.1、HEALTHCHECK参数    1、--interval=DURATION(default 30s) 健康检查间隔时间    2、--timeout=DURATION(default 30s) 超时时间    3、--start-period=DURATION(default 0s) 容器启动多久后执行健康检查    4、--retries=N(default 30s) 检测次数15.2、检查结果    0:成功    1:失败    2:预留字段
15.3、举例     HEALTHCHECK --interval=5m --timeout=5s CMD curl -f http://localhost:8080 ||exit1

16.SHELL:指定运行 RUN、CMD、ENTRYPOINT 的 shell 程序
17.OPSIGNAL:给主进程发送信号
18.ARG:docker build 过程中的参数

​​​​​​​

 18.1、定义pyton镜像作者,通过参数传入    FROM python    ARG author="latest"    LABLE author="${author}"    18.2、使用    docker build --build-arg author="haili"    18.3、常用在docker build 过程中替换参数

19.ONBUILD:用于在 Dockerfile 中定义一个触发器​​​​​​​

19.1、Dockerfile1中加一个ONBUILD add file,当docker build -t=testpython Dockerfile1的时候ONBUILD指令不会被执行,Dockerfile2中FROM testpython(Dockerfile1构建后生成的镜像),当运行docker build -t=test Dockerfile2的时候Dockerfile1中的ONBUILD add file会被执行19.2、Dockerfile用于build镜像文件,此镜像文件可以作为base image被另外一个Dockerfile作为FROM参数使用,并以之构建新的镜像文件19.3、在后面这个Dockerfile中的FROM指令在build过程中被执行时,将触发创建其base image的Dockerfile中ONBUILD指定定义的触发器19.4、尽管任何指令都可以注册为触发器指令,但是ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令19.5、使用包含ONBUILD指令的Dockerfile构建镜像应该使用特殊标签如,python:1.0-onbuild19.6、ONBUILD指令中使用ADD COPY指令要格外小心,因为新构建过程山下文缺少指定的源文件就会

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

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

相关文章

【EAI 005】EmbodiedGPT:通过具身思维链进行视觉语言预训练的具身智能大模型

论文描述&#xff1a;EmbodiedGPT: Vision-Language Pre-Training via Embodied Chain of Thought 论文作者&#xff1a;Yao Mu, Qinglong Zhang, Mengkang Hu, Wenhai Wang, Mingyu Ding, Jun Jin, Bin Wang, Jifeng Dai, Yu Qiao, Ping Luo 作者单位&#xff1a;The Universi…

Lumerical Monitors------ Global properties

Lumerical Monitors------ Global properties Global properties 全局属性 Global properties 全局属性 在 Lumerical 中&#xff0c;这里以 FDTD 工程文件举例&#xff0c;所有的 monitors 都可以通过上方选项卡中的 monitor 标签页添加。 注意上面有一个 Global properties…

R语言(12):绘图

12.1 创建图形 12.1.1 plot函数 plot(c(1,2,3),c(1,2,4)) plot(c(1,2,3),c(1,2,4),"b") plot(c(-3,3),c(-1,5),"n",xlab "x",ylab "y")12.1.2 添加线条&#xff1a;abline()函数 x <- c(1,2,3) y <- c(1,3,8) plot(x,y) lm…

【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计 基本配置一、序列1.1、序列使用1.1.1、设置字段为主键&#xff0c;数据类型默认整型1.1.2、自定义序列&#xff0c;数据类型自定义 1.2、序列延申1.2.1、理论1.2.2、测试1.2.3、小结 二、函数2.1、SQL直接创建2.1.1…

【redis】Redis中的字典类型:数据结构与使用方法

文章目录 Redis中的字典类型&#xff1a;数据结构与使用方法简介如何提高哈希表性能如何使用 Redis中的字典类型&#xff1a;数据结构与使用方法 简介 Redis中的字典类型的底层实现是哈希表&#xff08;Hash Table&#xff09;。 Redis的字典使用哈希表作为底层实现&#xf…

目标检测再升级!YOLOv8模型训练和部署

YOLOv8 是 Ultralytics 开发的 YOLO&#xff08;You Only Look Once&#xff09;物体检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的SOTA模型&#xff0c;它建立在先前YOLO成功基础上&#xff0c;并引入了新功能和改进&#xff0c;以进一步提升性能和灵活性。它可…

【conda】conda 版本控制和环境迁移/安装conda加速工具mamba /conda常用指令/Anaconda配置

【conda】安装conda加速工具mamba /conda常用指令/Anaconda配置 0. conda 版本控制和环境迁移1. 安装conda加速工具mamba2. conda install version3. [Anaconda 镜像](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)使用帮助4. error deal 0. conda 版本控制和环境迁移…

福建科立讯通信 指挥调度管理平台 多处文件上传漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任…

使用开源通义千问模型(Qwen)搭建自己的大模型服务

目标 1、使用开源的大模型服务搭建属于自己的模型服务&#xff1b; 2、调优自己的大模型&#xff1b; 选型 采用通义千问模型&#xff0c;https://github.com/QwenLM/Qwen 步骤 1、下载模型文件 开源模型库&#xff1a;https://www.modelscope.cn/models mkdir -p /data/…

【MATLAB】ICEEMDAN_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 ICEEMDAN-LSTM神经网络时序预测算法是一种结合了改进的完全扩展经验模态分解&#xff08;ICEEMDAN&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 …

运动耳机怎么选?2024年运动耳机推荐,运动蓝牙耳机排行榜10强

​在现代生活中&#xff0c;音乐和运动已经成为很多人生活不可分割的一部分。运动耳机在这样的背景下变得越来越受欢迎&#xff0c;它们不仅可以在运动时提供音乐的陪伴&#xff0c;还能增加运动时的乐趣和动力。但是&#xff0c;面对市面上众多不同类型的运动耳机&#xff0c;…

springboot集成cas客户端

Background 单点登录SSO(Single Sign ON)&#xff0c;指在多个应用系统中&#xff0c;只需登录一次&#xff0c;即可在多个应用系统之间共享登录。统一身份认证CAS&#xff08;Central Authentication Service&#xff09;是SSO的开源实现&#xff0c;利用CAS实现SSO可以很大程…

TikTok时代的社交红利:用户生成内容的崛起

TikTok&#xff0c;这款短视频平台在全球范围内掀起了一场社交媒体的新浪潮。在这个数字化的时代&#xff0c;用户生成内容成为了社交平台的核心&#xff0c;而TikTok正是在这一潮流中崭露头角。本文将深入探讨TikTok时代的社交红利&#xff0c;聚焦用户生成内容的崛起&#xf…

服务器运行状况监控工具

服务器运行状况监视提供了每个服务器状态和性能的广泛概述&#xff0c;通过监控服务器指标&#xff0c;如 CPU 使用率、内存消耗、I/O、磁盘使用率、进程等&#xff0c;服务器运行状况监控可以避免服务器停机。 服务器性能监控指标 服务器是网络中最重要的组件之一&#xff0…

大创项目推荐 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

构建免费的Dokan和WooCommerce构建线上课程市场在线销售数字课程

我们知道创建良好的学习说明和材料很困难。但当涉及到销售时&#xff0c;就变得更加困难。如果您无法出售您的课程&#xff0c;那么没有什么比这更令人沮丧的了。 幸运的是&#xff0c;如果您使用的是 WordPress 网站&#xff0c;那么您可以非常轻松且免费地完成此操作。借助L…

阿里云99元服务器赠送云·原生建站(电商版)

购买阿里云99元服务器赠送云原生建站&#xff08;电商版&#xff09;&#xff0c;什么是云原生建站&#xff1f;类似模板建站&#xff0c;云原生建站预置响应式模板CMS内容管理系统&#xff0c;用户可以按需随意切换模板样式&#xff0c;通过模板可视化在线编辑轻松完成网站搭建…

二进制部署

HOST HostnameIP地址flannedAPPmaster192.169.116.10ETCD\APIserver\Scheduler\Controller-Managernode1192.168.116.11172.17.28.0ETCD,Flanned,Kubelet,kube-proxynode2192.168.116.12172.17.26.0ETCD,Flanned,Kubelet,kube-proxy Kubernetes社区 Kubernetes文档 ETCD mas…

Spark内核解析-数据存储5(六)

1、Spark的数据存储 Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk&#xff0c;本文尝试分析Spark中存储子系统的构成&#xff0c;并以数据写入和数据读取为例&#xff0c;讲述清楚存储子系统中各部件的交互关系。 1.1存储子系统概览 …

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程&#xff0c;旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要&#xff0c;因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…