制作一个超小的docker镜像

        在制作docker镜像我们都希望能够制作一个超小的镜像,那么该怎么做呢,网上有很多优化镜像大小的方法,今天就不在重复了,今天给大家分享一个从源头控制大小的方案。

        Docker Scratch镜像是一个特殊的Docker镜像,它不基于任何其他镜像构建。相反,它是一个空白的镜像,只包含了Docker运行所需的最小文件系统和执行环境。这使得它非常适合用于构建轻量级容器化应用程序,因为它不包含任何额外的组件或库。

        这个镜像不需要下载,在dockerfile中直接FROM引用即可。

        接下来给大家演示一下做一个有bash命令的但是非常小的一个镜像。

编写获取bash命令的动态库的脚本

[root@localhost cc]# cat get_lib_info.sh 
#!/bin/bash# 函数:使用 ldd 和 awk 提取库文件路径
extract_library_paths() {local binary_path="$1"local paths=()# 运行 ldd 命令,过滤并提取库文件路径while IFS= read -r line; doif [[ "$line" =~ ^/ ]]; thenpaths+=("$line")fidone < <(ldd "$binary_path" | awk '/=>/ {if ($3 ~ /^\//) print $3}')while IFS= read -r line; doif [[ "$line" =~ ^/ ]]; thenpaths+=("$line")fidone < <(ldd "$binary_path" | awk '{print $1}' | grep '^/')# 返回路径数组echo "${paths[@]}"
}# 函数:解析符号链接路径
resolve_symlinks() {local path="$1"# 处理可能存在的符号链接链while [[ -L "$path" ]]; dotarget=$(readlink "$path")if [[ "${target:0:1}" != "/" ]]; thentarget=$(dirname "$path")/"$target"fipath="$target"done# 输出最终的真实路径echo "$path"
}# 主函数:处理二进制文件并生成解析后的路径
process_binary() {local binary="$1"local output_path="${2:-$(dirname "$0")}"  # 如果未提供第二个参数 $2,则默认为脚本所在目录local binary_name=$(basename "$binary")echo "二进制文件 $binary 的库文件路径:"# 提取库文件路径library_paths=($(extract_library_paths "$binary"))# 解析符号链接路径resolved_paths=()for path in "${library_paths[@]}"; doresolved_path=$(resolve_symlinks "$path")resolved_paths+=("$resolved_path")donefor path in "${library_paths[@]}"; doresolved_paths+=("$path")done# 打印解析后的路径# for path in "${resolved_paths[@]}"; do#     echo "$path"# done# 创建解析后路径的 tar 压缩包tar_filename="${output_path}/${binary_name##*/}.tar.gz"tar zcvf "$tar_filename" "${resolved_paths[@]}"echo "已创建压缩包:$tar_filename"
}# 示例用法:
binary="/bin/bash"
# output_directory="/tmp"  # 如果需要,可以修改为你希望的输出目录
process_binary "$binary" "$output_directory"mkdir /tmp/test
tar zxvf $tar_filename -C /tmp/test

编写Dockerfile

[root@localhost ]# cat Dockerfile 
FROM ubuntu:20.04
COPY get_lib_info.sh /
RUN chmod +x /get_lib_info.sh && \
/get_lib_info.shFROM scratch
COPY --from=0 /bin/bash /bin/bash
COPY --from=0 /tmp/test /CMD ["/bin/bash"]

构建镜像

[root@localhost ]# docker build -t mybash .[root@localhost ]# docker images mybash
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mybash       latest    11f3508d3dd1   23 seconds ago   3.61MB

验证

[root@localhost ]# docker run -it --rm mybash
bash-5.0# exit
exit
[root@localhost ]# 

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

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

相关文章

案例学习-存量更新规划实施探索(武汉)

案例学习-存量更新规划实施探索&#xff08;武汉&#xff09; 武汉市在早期旧城更新实践中发现零散化的更新往往导致资源配置分散、城市建设破碎化等弊病&#xff0c;特别是由于过于强调项目自身“经济平衡”&#xff0c;在实施过程中也逐步暴露出住宅占比过大、强度偏高、公服…

JS:获取鼠标点击位置

一、获取鼠标在目标元素中的点击位置 getClickPos.ts: export const getClickPos (e: MouseEvent) > {return {x: e.offsetX,y: e.offsetY,}; };二、获取鼠标在页面中的点击位置 getClickPos.ts: export const getPageClickPos (e: MouseEvent) > {return {x: e.pa…

算法day32

第一题 207. 课程表 步骤一&#xff1a; 通过下图的课程数组,首先画出DAG图&#xff08;有向无环图&#xff09; 步骤二&#xff1a; 其次我们按照DAG图&#xff0c;来构建该图的拓扑排序&#xff0c;等有效的点都按照规则排完序后&#xff0c;观察是否有剩下的点的入度不为0&…

MAC M1系统编译ffmpeg-gl-transition

MAC M1系统编译ffmpeg-gl-transition 1. 本人系统2. 编译&#x1f4b0;系统准备2.1. 下载【ffmpeg-gl-transition】到用户家目录下&#xff0c;并解压2.2 下载ffmpeg源码2.3. brew安装GLEW glfw32.4 复制vf_gltransition.c文件到ffmpeg2.5 修改ffmpeg源码文件2.6 设置库目录和…

qmt量化交易策略小白学习笔记第32期【qmt编程之获取行业概念数据--如何获取迅投行业成分股数据】

qmt编程之获取迅投行业成分股数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取迅投…

日常排查问题技巧小结

文章目录 1. 写在最前面1.1 关于程序突然消失这件事 2. 排查消失的程序2.1 程序崩溃2.2 系统强杀程序2.2 迁移服务误拉任务2.3 真相 3. 碎碎念4. 参考资料 1. 写在最前面 「焦虑、烦躁解决不了任何问题&#xff0c;只会让问题变得更加难严重」。工作越久&#xff0c;对于工作的…

大模型日报2024-06-15

大模型日报 2024-06-15 大模型资讯 新技术提升大型语言模型推理能力 摘要: 一种新技术使得像GPT-4这样的大型语言模型能够通过编写Python代码&#xff0c;更准确地解决数值或符号推理任务。 大型语言模型革命性提升蛋白质序列理解 摘要: 研究人员将蛋白质序列与自然语言进行类比…

查看队列资源限额和使用情况

查看队列资源限额和使用情况 背景 LSF中的 limits 配置模块允许管理员很方便地设置集群资源限额&#xff0c;可以在队列、主机对、应用维度对用户使用的资源如slot/core,、任务数/jobs、内存/mem、交换区/swap&#xff0c;以及自定义资源比如许可证进行限制。 问题 在实际工…

JAVA学习01

8个二进制位代表1字节 不能超出这个范围 文档注释 生成api文档 编码&#xff1a;保存数据的过程 解码&#xff1a;读数据 notic&#xff1a; 编码解码遵循的规范是一样的 gbk&#xff1a;中文 ansi代表gbk - 一个中文字占两个字节 udf-8 一个汉字占三个字节

一文了解Spark引擎的优势及应用场景

Spark引擎诞生的背景 Spark的发展历程可以追溯到2009年&#xff0c;由加州大学伯克利分校的AMPLab研究团队发起。成为Apache软件基金会的孵化项目后&#xff0c;于2012年发布了第一个稳定版本。 以下是Spark的主要发展里程碑&#xff1a; 初始版本发布&#xff1a;2010年开发…

2024全新仿麻豆视频苹果cms源码v10影视模板

下载地址&#xff1a;2024全新仿麻豆视频苹果cms源码v10影视模板 高端大气的设计&#xff0c;适合做电影、连续剧、综艺、动漫、微电影、纪录片、海外剧等视频网站

N3 中文文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 前面学习了相关自然语言编码&#xff0c;这周进行相关实战 导入依赖库和设置设备 import torch import torch.nn as nn import torchvision fro…

虚函数机制-动态绑定的应用

虚函数使得程序在运行的时候根据指针指向对象的类型来确定调用哪个函数。 下图中&#xff1a;都为静态绑定。因为在编译器就确定了可以调用的函数 此时当基类指针指向派生类对象时&#xff0c;因为没有virtual关键字&#xff0c;所以在编译阶段就根据指针类型确定了要指向的函…

秋招突击——第四弹——Java的SSN框架快速入门——Maven

文章目录 引言Maven分模块开发与设计分模块开发的过程 依赖管理可选依赖与排除依赖 继承与聚合聚合继承 属性和版本管理属性扩大集中管理的范围版本管理 多环境开发多环境开发 私服简介安装私服资源操作流程分析上传和下载 总结 引言 前一个部分花了太多时间&#xff0c;后续得…

vue2 + echats树状图 点击按钮 展开所有节点/收起所有节点

vue2 echats树状图 点击按钮 展开所有节点/收起所有节点 <template><div><button click"expandAll(isExpanded)">{{ isExpanded ? 一键收起 : 一键展开 }}</button><div ref"echartsTree" style"width: 600px; height:…

【Pandas驯化-02】pd.read_csv读取中文出现error解决方法

【Pandas】驯化-02pd.read_csv读取中文出现error解决方法 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公众号 &…

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal&#xff08;最小可检测信号&#xff09;是指当信号-噪声比&#xff08;Signal-to-Noise Ratio, SNR&#xff09;等于1时的输入信号水平。简单来说&#xff0c;MDS 是一个系统能够分辨出信号存在的最低输入信号…

视频网站下载利器yt-dlp参数详解

yt-dlp 是一个强大的命令行工具&#xff0c;用来下载 YouTube 和其他网站上的视频和音频。它拥有丰富的参数&#xff0c;可以定制下载行为&#xff0c;满足各种需求。本文将详细介绍 yt-dlp 的参数使用。 一、基本参数 -f, –format FORMAT: 指定下载格式&#xff0c;可以用视…

mysql:1205-Lock wait timeout exceeded;try restarting transaction

1.现象 2.分析 使用下面sql在自带数据库的information_schema中查询,注意观察那些长时间开启事务又没完成的进程,然后根据进程的db、操作人、主机、事务开启时间和状态,来排查是什么情况导致的事务未完成(代码异常、执行时间超时等等);我这里是异步作业事务执行时间过长导致的 …