【还不了解 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.txtADD autoTest /home/WORKDIR /home/autoTestEXPOSE 8000ENTRYPOINT uwsgi --ini uwsgi.ini
二、Dockerfile 编写规则
-
指令大小写不敏感,为了区分习惯上用大写
-
Dockerfile 非注释行第一行必须是 FROM
-
文件名必须是 Dockerfile
-
Dockerfile 指定一个专门的目录为工作空间
-
所有引入映射的文件必须在这个工作空间目录下
-
Dockerfile 工作空间目录下支持隐藏文件(.dockeringore)
-
(.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录
-
每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条
三、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/testDir1、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:latestworkdir /mntrun touch a.txtworkdir /usrrun 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 value1、key之后的所有内容都会被视为value,因此,一次只能设置一个变量9.2、ENV key=value1、可以设置多个变量,每个key=value键值对为一个变量2、如果value中包含空格需要用反斜杠转义,也可以对value加引号进行标识,反斜杠也可以用于续行9.3、调用格式:$variable_name 或 ${variable_name}9.4、定义多个变量建议使用第二种方式,以便在同一层中完成9.5、举例ENV DOC_DIR=/mnt/docCOPY 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 command1、通常是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:latestLABLE 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 pythonARG 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 非常火,想要玩好 Docker 的话 Dockerfile 是绕不开的,这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。 今天我们就来聊一聊 Dockerfile 怎么写,那些指令到底是什么意思。 前言 一、先来看一个简单的 Dockerfile #这…...
新手一键重装系统Win10步骤教程
如果我们发现电脑上的操作系统出现很严重的问题,不能通过简单的操作解决,这时候就可以选择重新安装电脑系统,快速解决问题。但是,新手用户不具备专业的装机知识,不知道重装Win10系统要怎么操作?那么可以按照…...
Ceph源码分析-在C++中,符号““和“*“有不同的用法。
在C中,符号"&"和"*"有不同的用法。 "&"符号: 在变量声明时,"&"用于定义引用类型。例如:int a 10; int& ref a; 这里的"ref"是一个引用,它引用了…...
Azure AI 内容安全Content Safety Studio实战
Azure AI Content Safety 检测应用程序和服务中用户生成和 AI 生成的有害内容。 Azure AI 内容安全包括文本和图像 API,可用于检测有害材料。 交互式 Content Safety Studio,可用于查看、浏览和试用用于检测不同形式的有害内容的示例代码。 关注TechLead…...
计算机网络学习笔记(四)
文章目录 1.介绍一下HTTPS的流程。2.介绍一下HTTP的失败码。3.说一说你知道的http状态码。4. 301和302有什么区别?5.302和304有什么区别?6. 请描述一次完整的HTTP请求的过程。7.什么是重定向?8. 重定向和请求转发有什么区别?9.介绍…...
typora导出html添加目录
typora导出html添加目录 使用方法 首先要从typora导出html文件,之后用记事本编辑器html文件 找到文档最后面,如图: 用文字编辑类工具打开sideBar.txt,复制其中所有内容【内容在下面】 在如上图的位置插入所复制的内容 打开修改…...
vue3 封装一个按钮组件(可自定义按钮样式)
效果图 鼠标悬浮有对应的文字提示,且图标出现背景色和颜色 实现 目前提供五个固定样式的图标及三个用户自定义的图标,可根据需要补充 组件代码 <script setup lang"ts"> import { onMounted, PropType, reactive, ref, watch } from v…...
Docker 中使用超级用户
在docker中安装keytool产生的问题: 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
场景:某次git代码发布后定版记录,将发版所在的commit时候代码打上tag记录,方便后期切换到对应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,版本是C00,也就是V12.0.0。...
纯前端上传word,xlsx,ppt,在前端预览并下载成图片(预览效果可以,下载图片效果不太理想)
纯前端上传word,xlsx,ppt,在前端预览并下载成图片(预览效果可以,下载图片效果不太理想) 一.安装依赖二、主要代码 预览效果链接: https://github.com/501351981/vue-office 插件文档链接: https://501351981.github.io/vue-office/examples/d…...
WPS Office找回丢失的工作文件
WPS office恢复办公文件方法有两种. 1.通过备份中心可以查看近期编辑 office 历史版本进行恢复. 2.缓存备份目录可以查看编辑过的 office 文件的历史版本,新版本 WPS 可以在配置工具-备份清理找到,2019 年旧版本 WPS 可以在新建任意 office 文件-文件-选…...
【MATLAB源码-第106期】基于matlab的SAR雷达系统仿真,实现雷达目标跟踪功能,使用卡尔曼滤波算法。
操作环境: MATLAB 2022a 1、算法描述 1. 雷达系统参数设定: - 工作频率:选择一个适合的工作频率,例如X波段(8-12 GHz)。 - 脉冲重复频率(PRF):设定一个适当的PR…...
【机器学习】scikit-learn机器学习中随机数种子的应用与重现
随机数种子是为了能重现某一次实验生成的随机数而设立的,相同的随机数种子下,生成的随机数序列一样 一、随机数种子基础应用 在python中简单运用随机数种子 import random random.seed(1) a random.sample(range(0,100),10) random.seed(2) b random.…...
欧洲编程语言四巨头
从左往右,依次是 尼克劳斯沃斯 (Niklaus Wirth),迪杰斯特拉(Edsger Dijkstra),霍尔(Tony Hoare) 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人,一生发明了8种编程语言,其中最著…...
检查密码(字符串)
本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。 输入格式: 输入第一行给出一个正整数 N(≤…...
Pointnet++改进注意力机制系列:全网首发LSKAttention大核卷积注意力机制 |即插即用,实现有效涨点
简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入LSKAttention注意力机制,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二...
C++常用库函数大小写转换
在我们在编写代码时大小写转换是基础知识,这篇博客将通过介绍C常用库函数来回顾和学习一种不一样的大小写转换 目录 一、islower/isupper函数二、tolower/toupper函数三、ASCLL码 一、islower/isupper函数 islower和isupper函数是C标准库中的字符分类函数ÿ…...
基于springboot+html的汽车销售管理系统设计与实现
基于springboothtml的汽车销售管理系统 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 前言 随着汽车市场的快速发展,汽车销售企业面临着越来越大的管理…...
pyside6 界面美化库的使用
使用qt_material库,在库中进行导入后,直接使用库提供的皮肤即可非常简单 example: # -*- coding: utf-8 -*- # 使用例子 import sys # from PySide6 import QtWidgets # from PySide2 import QtWidgets from PySide6 import QtWidgets from…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
