Dockerfile详解#如何编写自己的Dockerfile
文章目录
- 前言
- 编写规则
- 指令详解
- FROM:基础镜像
- LABEL:镜像描述信息
- MAINTAINER:添加作者信息
- COPY:从宿主机复制文件到镜像中
- ADD:从宿主机复制文件到镜像中
- WORKDIR:设置工作目录
前言
Dockerfile是编写docker镜像必备的技能,那么镜像是如何构建?镜像分层,这个层怎么分的,就是由Dockerfile中的每一条指令构成
官方文档直达:Dockerfile
构建命令:
通过docker build -t repository:tag ./即可构建,要求:./下存在Dockerfile文件
编写规则
- 文件名必须是
Dockerfile- Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下
- Dockerfile中相对路径默认都是Dockerfile所在的目录
- Dockerfile中
能写到一行的指令,一定要写到一行,因为每条指令都被视为一层,层多了执行效率就慢- Dockerfile中
指令大小写不敏感,但指令都用大写(约定俗成)- Dockerfile 非注释行第一行必须是 FROM
- Dockerfile 工作空间目录下支持隐藏文件(.dockeringore),类似于git的.gitingore
指令详解
FROM:基础镜像
FROM <image>:<tag> [as other_name] # tag可选;不写默认是latest版
FROM是Dockerfile文件开篇第一个非注释行代码- 用于为镜像文件构建过程指定基础镜像,后续的指令都基于该基础镜像环境运行
- 基础镜像可以是任何一个镜像文件
as other_name是可选的,通常用于多阶段构建(有利于减少镜像大小)- 使用是通过
--from other_name使用,例如COPY --from other_name
LABEL:镜像描述信息
LABEL author="zp wang <test@qq.com>"
LABEL describe="test image"# 或
LABEL author="zp wang <test@qq.com>" describe="test image"# 或
LABEL author="zp wang <test@qq.com>" \describe="test image"
- LABEL指令用来给镜像以键值对的形式添加一些元数据信息
- 可以替代MAINTAINER指令
- 会集成基础镜像中的LABEL,key相同会被覆盖
MAINTAINER:添加作者信息
MAINTAINER zp wang <test@163.com>
- 慢慢废弃
COPY:从宿主机复制文件到镜像中
COPY <src> <dest>
COPY ["<src>", "<src>", ... "<dest>"]
<src>:要复制的源文件或目录,支持通配符<src>必须在build所在路径或子路径下,不能是其父目录<src>是目录。其内部的文件和子目录都会递归复制,但<src>目录本身不会被复制- 如果指定了多个
<src>或使用了通配符,这<dest>必须是一个目录,且必须以/结尾
<dest>:目标路径,即镜像中文件系统的路径<dest>如果不存在会自动创建,包含其父目录路径也会被创建

# 拷贝一个文件
COPY testFile /opt/
# 拷贝一个目录
COPY testDir /opt/testDir
- testDir下所有文件和目录都会被递归复制
- 目标路径要写testDir,否则会复制到/opt下
ADD:从宿主机复制文件到镜像中
类似于
COPY指令,但ADD支持tar文件和URL路径
ADD <src> <dest>ADD ["<src>","<src>"... "<dest>"]
<src>如果是一个压缩文件(tar),被解压为一个目录,如果是通过URL下载一个文件不会被解压<src>如果是多个,或使用了通配符,则<dest>必须是以/结尾的目录,否则<src>会被作为一个普通文件,<src>的内容将被写入到<dest>

ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
操作准则同COPY指令的4点准则如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;
如果<dest>以/结尾,则文件名URL指定的文件将被直接下载,并保存为<dest>/<filename>,注意,URL不能是ftp格式的url
如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令,然后,通过URL获取到的tar文件将不会自动展开
如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;
如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>;
WORKDIR:设置工作目录
- 类似于cd命令,为了改变当前的目录域
- 此后RUN、CMD、ENTRYPOINT、COPY、ADD等命令都在此目录下作为当前工作目录
WORKDIR /opt
- 如果设置的目录不存在会自动创建,包括他的父目录
- 一个
Dockerfile中WORKDIR可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR路径 WORKDIR也可以调用ENV指定的变量

WORKDIR <dirpath>在Dockerfile文件中, WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个 WORKDIR指令指定的路径;另外, WORKDIR也可调用由 ENV指定定义的变量 .例如WORKDIR /var/log
WORKDIR $STATEPATH示例:WORKDIR /a (这时工作目录为/a)WORKDIR b (这时工作目录为/a/b)WORKDIR c (这时工作目录为/a/b/c)
注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run 运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。相关文章:
Dockerfile详解#如何编写自己的Dockerfile
文章目录 前言编写规则指令详解FROM:基础镜像LABEL:镜像描述信息MAINTAINER:添加作者信息COPY:从宿主机复制文件到镜像中ADD:从宿主机复制文件到镜像中WORKDIR:设置工作目录 前言 Dockerfile是编写docker镜…...
Elasticsearch桶聚合和管道聚合
1. 根据名称统计数量 GET order/_search {"_source": false,"aggs": {"aggs_name": { // 自定义查询结果名称"terms": { // 使用的函数"field": "name.keyword"}}} }查询结果例子: "aggregat…...
联想范建平:联想混合AI架构具备两大明显优势
12月7日,首届AI PC创新论坛在北京联想集团总部举办。联想集团副总裁、联想研究院人工智能实验室负责人范建平表示,为提供真正可信、个性化的AI专属服务,联想提出了混合智能(Hybrid AI)概念,并已经显现出更强…...
探索Spring事件监听机制的奇妙世界
文章目录 什么是Spring事件监听机制主要组件内置的事件监听类自定义事件监听类总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 什么是Spring事件监听机制 Spring事件监听机制是Spr…...
什么是散列函数
散列函数是一种公开的数学函数。散列函数运算的输入信息也可叫作报文。散列函数运算后所得到的结果叫作散列码或者叫作消息摘要。散列函数具有如下一些特点: (1)不同内容的报文具有不同的散列码,而一旦原始报文有任何改变…...
tomcat反序列化
漏洞介绍: 漏洞名称: Apache Tomcat反序列化漏洞影响范围: Apache Tomcat服务器中使用了自带session同步功能的配置,且没有使用Encrypt Interceptor加密拦截器的情况下。漏洞描述: Apache Tomcat是一个基于Java的Web应用软件容器,用于运行servlet和JSP Web应用。当Tomc…...
flask 请求勾子实现 request_auth认证
from flask import g,request from comment.utils.tokens_pyjwt import verify_tokensdef jwt_request_auth():从请求(request)中获取token,并且验证token,验证成功之后把用户id保存到全局变量g中g.user_idNone #定义变量#前端代码是是把token携带请求头…...
【STM32入门】3.OLED屏幕
1.OLED引脚 OLED屏幕的接线按图所示,本例中用的是4管脚OLED屏幕 2.驱动程序 配套的驱动程序是“OLED.c",主要由以下函数构成:1、初始化;2、清屏;3、显示字符;4、显示字符串;5、显示数字…...
python圣诞树代码编程
以下是一个简单的Python圣诞树代码: def draw_tree(height): for i in range(height): print( * (height - i - 1) * * (2 * i 1)) print( * (height - 1) |)draw_tree(10) 这个函数会绘制一个等腰三角形,其中每一行的星号数量从1开…...
js数组删除某个元素
...
hbuilder + uniapp +vue3 开发微信云小程序
1、创建项目: 2、创建项目完成的默认目录结构: 3、在根目录新建一个文件夹cloudFns(文件名字随便),存放云函数源码: 4、修改manifest.json文件:添加 小程序 appid和cloudfunctionRoot࿰…...
服务器配置免密SSH
在当今互联网时代,远程工作和网络安全已成为信息技术领域的热点话题。无论是管理远程服务器、维护网络设备还是简单地从家中连接到办公室,安全始终是首要考虑的因素。这就是为什么 SSH(Secure Shell)成为了网络专业人士的首选工具…...
2023 开发人员生态系统现状信息图:《开发者生态系统现状报告》
本心、输入输出、结果 文章目录 2023 开发人员生态系统现状信息图:《开发者生态系统现状报告》前言目录细节软件开发者薪资趋势过去 3 年科技行业的性别分布 生成式 AI 服务的复杂格局开发者社区的心理健康花有重开日,人无再少年实践是检验真理的唯一标准…...
TCP协议实现一对一聊天
服务端代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * 发送消息线程 */ class…...
python使用conda管理多个环境
一、Anaconda简介 Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包,涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能,可以很方…...
实现个微机器人的二次开发
请求URL: http://域名地址/scanJoinRoom 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId是string登录实例标识url是string…...
Android 记录一些Framework开发的命令
源码编译流程 1. "source build/envsetup.sh" (source可以用 . 代替,即". build/envsetup.sh") 2. "lunch",并选择要编译的项目或者"choosecombo" 3. "make idegen -j4" (这里的 -j4 表示用4线程来…...
Ant Design Vue 年选择器
文章目录 参考文档效果展示实现过程 参考文档 提示:这里可以添加本文要记录的大概内容: DatePicker 日期选择框 大佬:搬砖小匠(Ant Design vue 只选择年) 提示:以下是本篇文章正文内容,下面案…...
AGM CPLD 应用指南
AGM的部分料号跟Altera 硬件Pin to Pin兼容,映射关系表如下: EPM240T100CxN—>AG256SL100(CPLD) EPM240T100IxN---->AG256SL100(CPLD) EPM570T100CxN—>AG576SL100(CPLD) EPM570T100IxN---->AG576SL100(CPLD) EPM570T144CxN—>AG576SL144…...
(1)词法分析器
简单来说就是写一个函数,这个函数的输入是文字流,我们要把这个文字流的标签搞出来 比如某种语言标签如下 enum Token {tok_eof -1,// commandstok_def -2,tok_extern -3,// primarytok_identifier -4,tok_number -5, }; 然后词法分析器相当于一个…...
嵌入式Linux C语言开发核心技术与实践
嵌入式Linux开发中的C语言编程要点解析1. 嵌入式C语言开发概述1.1 嵌入式环境特点在嵌入式Linux开发中,C语言作为主要编程语言具有不可替代的地位。与通用计算机环境相比,嵌入式系统具有资源受限、实时性要求高、硬件接口特殊等特点,这些特性…...
如何快速实现Figma中文界面:设计师必备的免费本地化插件
如何快速实现Figma中文界面:设计师必备的免费本地化插件 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否曾因Figma的英文界面而感到困扰?想要专注于设计创…...
使用 Aspen Plus 模拟天然气的自热转化
使用aspen plus模拟天然气的自热转化自热重整工艺消耗蒸汽和氧气,将天然气转化为合成气。 事实上,自热转化工艺是放热的部分氧化(POX)工艺和内热的蒸汽甲烷转化(SMR)工艺的结合,从热力学角度中和…...
uDebugLib:嵌入式零开销串口调试库设计与实践
1. uDebugLib 库概述uDebugLib 是一个轻量级、跨平台的嵌入式串口调试辅助库,专为 Arduino 及兼容平台(如 ESP32、STM32(通过Arduino Core)、nRF52 等)设计。其核心目标并非替代完整的日志系统(如esp_log或…...
Gear-Lib系统抽象层揭秘:POSIX适配与硬件抽象设计思想
Gear-Lib系统抽象层揭秘:POSIX适配与硬件抽象设计思想 【免费下载链接】gear-lib Gear-Lib, C library for IOT Embedded Multimedia and Network 项目地址: https://gitcode.com/gh_mirrors/ge/gear-lib Gear-Lib作为面向物联网嵌入式多媒体与网络的C语言库…...
聊天记录全方位管理:WeChatMsg革新性本地数据解决方案
聊天记录全方位管理:WeChatMsg革新性本地数据解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...
Python 数据统计分析全攻略:从基础到实战,一文掌握常用方法
在数据分析、机器学习、业务报表开发等场景中,数据统计分析是核心基础环节。Python 凭借丰富的第三方库,成为数据统计分析的首选工具。本文将系统梳理 Python 中数据统计分析的常用方法、核心库、实战代码,从基础统计量到高级分析,…...
5分钟掌握Google Drive受保护PDF下载:免费开源解决方案终极指南
5分钟掌握Google Drive受保护PDF下载:免费开源解决方案终极指南 【免费下载链接】Google-Drive-PDF-Downloader 项目地址: https://gitcode.com/gh_mirrors/go/Google-Drive-PDF-Downloader 还在为Google Drive中那些"仅查看"权限的PDF文件而烦恼…...
Verdi隐藏技巧:不为人知的VC Apps批处理参数大全(以listRegisters为例)
Verdi隐藏技巧:VC Apps批处理参数深度解析与实战指南 在芯片验证领域,Verdi作为业界领先的调试工具,其VC Apps组件提供了强大的批处理能力。本文将深入探讨官方文档未明确说明的高级参数技巧,特别是以listRegisters为例的实战应用…...
小米音乐Docker化解决方案:打造智能家居音乐中枢实战指南
小米音乐Docker化解决方案:打造智能家居音乐中枢实战指南 【免费下载链接】xiaomusic 使用小爱同学播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 小米音乐Docker项目是一款专为技术爱好者和开发…...
