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, }; 然后词法分析器相当于一个…...
告别闪烁屏!瑞芯微RK3399开发板Debian系统烧写保姆级教程(含DriverAssistant v5.1.1 + AndroidTool v2.69)
RK3399开发板Debian系统烧写实战:从屏幕闪烁到完美显示的终极解决方案 当你在RK3399开发板上成功烧写Debian系统后,最期待的莫过于看到系统稳定运行的画面。然而,不少开发者却遭遇了屏幕闪烁的困扰——这个问题看似简单,背后却隐藏…...
OpenClaw 快速接入 MiniMax 图文指南
OpenClaw连接MiniMax图文教程 前置准备 已安装并可以正常打开 OpenClaw Windows。 OpenClaw 顶部 Gateway 状态保持在线。 电脑可以正常联网并访问 MiniMax 开放平台。 建议提前准备好 MiniMax 开放平台账号。 如果账户余额为 0.00,需要先充值后再调用接口。 …...
如何用FontForge从零设计专业字体?揭秘字体编辑器的核心玩法
如何用FontForge从零设计专业字体?揭秘字体编辑器的核心玩法 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge 想象一下,你手写的签名、设计的l…...
基于RK3568核心板的智能家居控制器:从硬件选型到软件架构实战
1. 项目概述:当智能家居控制器遇上国产高性能核心板最近在做一个智能家居中控的案子,客户对性能、成本和本地化能力要求都比较高。选型阶段,我们团队把市面上主流的几款ARM核心板都摸了一遍,从传统的树莓派CM4到全志、瑞芯微的方案…...
AMD Ryzen调试神器SMUDebugTool:免费开源工具让你的处理器性能飞起来!
AMD Ryzen调试神器SMUDebugTool:免费开源工具让你的处理器性能飞起来! 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Tab…...
到底如何?大跨度“玻璃肋”幕墙,安全吗?
到底如何?大跨度“玻璃肋”幕墙,安全吗? 1 概述 自玻璃诞生之日起,这种无色透明的物质便与建筑结下了不解之缘。随着“苹果店”的火热,通透、纯净的全玻结构系统使玻璃的材料特性发挥到了极致。当我们乐见于越来越大的玻璃幅面、越来越高的幕墙跨度时,全玻结构所具有的…...
Point Transformer V3 牙齿语义分割测试结果为0问题:完整调试与修复方案
Point Transformer V3 牙齿语义分割测试结果为0问题:完整调试与修复方案 摘要 Point Transformer V3(PTv3)是CVPR 2024发布的高效点云处理模型,在语义分割任务中表现出色。然而,在16类牙齿语义分割任务的测试阶段,模型输出全部为0的问题却常常困扰开发者。本文将从数据…...
从开发板到自研板:RK3568设备树移植与定制编译实战
1. RK3568设备树移植入门指南 第一次接触RK3568设备树移植的工程师,往往会被dts文件中密密麻麻的节点和属性搞得晕头转向。我刚开始做这块的时候,光是看那7000多行的代码就头疼。但其实只要掌握几个关键点,移植工作就会变得清晰很多。 设备树…...
django-stubs模型类型检查实战:告别运行时错误的终极指南
django-stubs模型类型检查实战:告别运行时错误的终极指南 【免费下载链接】django-stubs PEP-484 stubs for Django 项目地址: https://gitcode.com/gh_mirrors/dj/django-stubs 在Django开发中,模型定义是核心环节,但传统开发模式下&…...
Go语言实现M3U8视频下载器:技术原理与实战应用深度解析
Go语言实现M3U8视频下载器:技术原理与实战应用深度解析 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-d…...
