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

【还不了解 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指令要格外小心,因为新构建过程山下文缺少指定的源文件就会

相关文章:

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

近年来 Docker 非常火&#xff0c;想要玩好 Docker 的话 Dockerfile 是绕不开的&#xff0c;这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。 今天我们就来聊一聊 Dockerfile 怎么写&#xff0c;那些指令到底是什么意思。 前言 一、先来看一个简单的 Dockerfile #这…...

新手一键重装系统Win10步骤教程

如果我们发现电脑上的操作系统出现很严重的问题&#xff0c;不能通过简单的操作解决&#xff0c;这时候就可以选择重新安装电脑系统&#xff0c;快速解决问题。但是&#xff0c;新手用户不具备专业的装机知识&#xff0c;不知道重装Win10系统要怎么操作&#xff1f;那么可以按照…...

Ceph源码分析-在C++中,符号““和“*“有不同的用法。

在C中&#xff0c;符号"&"和"*"有不同的用法。 "&"符号&#xff1a; 在变量声明时&#xff0c;"&"用于定义引用类型。例如&#xff1a;int a 10; int& ref a; 这里的"ref"是一个引用&#xff0c;它引用了…...

Azure AI 内容安全Content Safety Studio实战

Azure AI Content Safety 检测应用程序和服务中用户生成和 AI 生成的有害内容。 Azure AI 内容安全包括文本和图像 API&#xff0c;可用于检测有害材料。 交互式 Content Safety Studio&#xff0c;可用于查看、浏览和试用用于检测不同形式的有害内容的示例代码。 关注TechLead…...

计算机网络学习笔记(四)

文章目录 1.介绍一下HTTPS的流程。2.介绍一下HTTP的失败码。3.说一说你知道的http状态码。4. 301和302有什么区别&#xff1f;5.302和304有什么区别&#xff1f;6. 请描述一次完整的HTTP请求的过程。7.什么是重定向&#xff1f;8. 重定向和请求转发有什么区别&#xff1f;9.介绍…...

typora导出html添加目录

typora导出html添加目录 使用方法 首先要从typora导出html文件&#xff0c;之后用记事本编辑器html文件 找到文档最后面&#xff0c;如图&#xff1a; 用文字编辑类工具打开sideBar.txt&#xff0c;复制其中所有内容【内容在下面】 在如上图的位置插入所复制的内容 打开修改…...

vue3 封装一个按钮组件(可自定义按钮样式)

效果图 鼠标悬浮有对应的文字提示&#xff0c;且图标出现背景色和颜色 实现 目前提供五个固定样式的图标及三个用户自定义的图标&#xff0c;可根据需要补充 组件代码 <script setup lang"ts"> import { onMounted, PropType, reactive, ref, watch } from v…...

Docker 中使用超级用户

在docker中安装keytool产生的问题&#xff1a; sudo apt-get install openjdk-8-jre-headless bash: sudo: command not found elasticsearchd989639e3cb4:~/config/certs$ apt-get install openjdk-8-jre-headless E: Could not open lock file /var/lib/dpkg/lock-frontend …...

git打tag以及拉取tag

场景&#xff1a;某次git代码发布后定版记录&#xff0c;将发版所在的commit时候代码打上tag记录&#xff0c;方便后期切换到对应tag代码位置。 查看所有tag名 git tag// 1.1.0 // 1.0.0查看tag和描述 git tag -l -n//1.0.0 云监管一期项目完结 //1.1.0 …...

TS 36.212 V12.0.0-信道编码、复用和交织(1)-通用过程

本文的内容主要涉及TS 36.212&#xff0c;版本是C00&#xff0c;也就是V12.0.0。...

纯前端上传word,xlsx,ppt,在前端预览并下载成图片(预览效果可以,下载图片效果不太理想)

纯前端上传word,xlsx,ppt,在前端预览并下载成图片&#xff08;预览效果可以&#xff0c;下载图片效果不太理想&#xff09; 一.安装依赖二、主要代码 预览效果链接: https://github.com/501351981/vue-office 插件文档链接: https://501351981.github.io/vue-office/examples/d…...

WPS Office找回丢失的工作文件

WPS office恢复办公文件方法有两种. 1.通过备份中心可以查看近期编辑 office 历史版本进行恢复. 2.缓存备份目录可以查看编辑过的 office 文件的历史版本&#xff0c;新版本 WPS 可以在配置工具-备份清理找到&#xff0c;2019 年旧版本 WPS 可以在新建任意 office 文件-文件-选…...

【MATLAB源码-第106期】基于matlab的SAR雷达系统仿真,实现雷达目标跟踪功能,使用卡尔曼滤波算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 雷达系统参数设定&#xff1a; - 工作频率&#xff1a;选择一个适合的工作频率&#xff0c;例如X波段&#xff08;8-12 GHz&#xff09;。 - 脉冲重复频率&#xff08;PRF&#xff09;&#xff1a;设定一个适当的PR…...

【机器学习】scikit-learn机器学习中随机数种子的应用与重现

随机数种子是为了能重现某一次实验生成的随机数而设立的&#xff0c;相同的随机数种子下&#xff0c;生成的随机数序列一样 一、随机数种子基础应用 在python中简单运用随机数种子 import random random.seed(1) a random.sample(range(0,100),10) random.seed(2) b random.…...

欧洲编程语言四巨头

从左往右&#xff0c;依次是 尼克劳斯沃斯 (Niklaus Wirth)&#xff0c;迪杰斯特拉&#xff08;Edsger Dijkstra&#xff09;&#xff0c;霍尔&#xff08;Tony Hoare&#xff09; 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人&#xff0c;一生发明了8种编程语言&#xff0c;其中最著…...

检查密码(字符串)

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成&#xff0c;并且只能有英文字母、数字和小数点 .&#xff0c;还必须既有字母也有数字。 输入格式&#xff1a; 输入第一行给出一个正整数 N&#xff08;≤…...

Pointnet++改进注意力机制系列:全网首发LSKAttention大核卷积注意力机制 |即插即用,实现有效涨点

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入LSKAttention注意力机制,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二...

C++常用库函数大小写转换

在我们在编写代码时大小写转换是基础知识&#xff0c;这篇博客将通过介绍C常用库函数来回顾和学习一种不一样的大小写转换 目录 一、islower/isupper函数二、tolower/toupper函数三、ASCLL码 一、islower/isupper函数 islower和isupper函数是C标准库中的字符分类函数&#xff…...

基于springboot+html的汽车销售管理系统设计与实现

基于springboothtml的汽车销售管理系统 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 前言 随着汽车市场的快速发展&#xff0c;汽车销售企业面临着越来越大的管理…...

pyside6 界面美化库的使用

使用qt_material库&#xff0c;在库中进行导入后&#xff0c;直接使用库提供的皮肤即可非常简单 example&#xff1a; # -*- coding: utf-8 -*- # 使用例子 import sys # from PySide6 import QtWidgets # from PySide2 import QtWidgets from PySide6 import QtWidgets from…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...