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

把本机的bash构建到docker镜像里面

最近突发奇想,想把本机的bash放到docker镜像里面,接下来看操作。

获取bash以及依赖

[root@bogon ~]# cat get_lib_info.sh 
#!/bin/bash# 函数:显示帮助信息
show_help() {echo "Usage: $(basename "$0") -h -f <file> -b <output_directory>"echo "  -h          Display this help message"echo "  -f <file>   Specify the binary file to query"echo "  -b <output_directory>  Specify the output directory for the compressed file"
}# 函数:使用 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=""local output_directory="$(dirname "$0")"# 如果没有提供任何参数,则显示帮助信息if [ "$#" -eq 0 ]; thenshow_helpexit 0fi# 解析命令行参数while getopts "hf:b:" opt; docase "$opt" inh)  # 显示帮助信息show_helpexit 0;;f)  # 指定要查询的文件binary="$OPTARG"if [ ! -f "$binary" ]; thenecho "Error: File '$binary' does not exist." >&2exit 1fi;;b)  # 指定输出的目录output_directory="${OPTARG}";;*)  # 处理未知选项echo "Invalid option: -$OPTARG" >&2show_helpexit 1;;esacdone# 检查是否提供了二进制文件路径if [ -z "$binary" ]; thenecho "Error: You must specify a binary file with the -f option." >&2show_helpexit 1fi# 提取库文件路径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 压缩包local binary_name=$(basename "$binary")tar_filename="${output_directory}/${binary_name##*/}.tar.gz"tar zcvf "$tar_filename" "${resolved_paths[@]}"echo "已创建压缩包:$tar_filename"
}# 主程序开始
process_binary "$@"[root@bogon ~]# chmod +x get_lib_info.sh 
[root@bogon ~]# ./get_lib_info.sh -f /bin/bash
tar: Removing leading `/' from member names
/lib64/libtinfo.so.5.9
/lib64/libdl-2.17.so
/lib64/libc-2.17.so
/lib64/ld-2.17.so
/lib64/libtinfo.so.5
/lib64/libdl.so.2
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
已创建压缩包:./bash.tar.gz[root@bogon ~]# cp /bin/bash ./

编写Dockerfile

[root@bogon ~]# cat Dockerfile 
FROM scratchADD bash.tar.gz /
COPY bash /bin/bashCMD ["/bin/bash"][root@bogon ~]# docker build -t mybash .
[+] Building 0.1s (6/6) FINISHED                                     docker:default=> [internal] load build definition from Dockerfile                           0.0s=> => transferring dockerfile: 108B                                           0.0s=> [internal] load .dockerignore                                              0.0s=> => transferring context: 2B                                                0.0s=> [internal] load build context                                              0.0s=> => transferring context: 1.02MB                                            0.0s=> [1/2] ADD bash.tar.gz /                                                    0.0s=> [2/2] COPY bash /bin/bash                                                  0.0s=> exporting to image                                                         0.0s=> => exporting layers                                                        0.0s=> => writing image sha256:86b7d3cc6ffbed8e9c7a921af3d6d671d4692cda8e4fa3924  0.0s=> => naming to docker.io/library/mybash                                      0.0s[root@bogon ~]# docker run -it --rm mybash
bash-4.2# exit
exit
[root@bogon ~]#

相关文章:

  • 【源码】16国语言交易所源码/币币交易+期权交易+秒合约交易+永续合约+交割合约+新币申购+投资理财/手机端uniapp纯源码+PC纯源码+后端PHP
  • 显示数据库信息及发送Ajax请求
  • 【iOS】JSONModel源码阅读笔记
  • 【线性代数】第七章-二次型
  • Python闯LeetCode--第3题:无重复字符的最长子串
  • Node.js和npm的安装及配置
  • Centos系统yum安装mysql数据库
  • 将自己md文件发布到自己的博客园实现文件的持久化存储
  • FreeRTOS简单内核实现6 优先级
  • 小白跟做江科大32单片机之定时器输出比较
  • day38-39| 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62.不同路径 343. 整数拆分 96.不同的二叉搜索树
  • 数据结构--力扣104,110 二叉树相关(C
  • springboot+shiro+jwt 兼容session和token
  • mac m芯片安装win11遇坑
  • MySQL 之 JSON 支持(三)—— JSON 函数
  • @angular/forms 源码解析之双向绑定
  • AngularJS指令开发(1)——参数详解
  • ECS应用管理最佳实践
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 网络编程(2):UDP 的使用
  • nodejs:开发并发布一个nodejs包
  • Vue 动态创建 component
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 浅谈web中前端模板引擎的使用
  • 使用parted解决大于2T的磁盘分区
  • 算法系列——算法入门之递归分而治之思想的实现
  • 限制Java线程池运行线程以及等待线程数量的策略
  • k8s使用glusterfs实现动态持久化存储
  • 回归生活:清理微信公众号
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​flutter 代码混淆
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ## 1.3.Git命令
  • #pragam once 和 #ifndef 预编译头
  • #pragma data_seg 共享数据区(转)
  • (19)夹钳(用于送货)
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (C++哈希表01)
  • (Java)【深基9.例1】选举学生会
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (SERIES12)DM性能优化
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (第一天)包装对象、作用域、创建对象
  • (九)c52学习之旅-定时器
  • (十) 初识 Docker file
  • (四)库存超卖案例实战——优化redis分布式锁
  • (小白学Java)Java简介和基本配置
  • (一)kafka实战——kafka源码编译启动
  • (译)2019年前端性能优化清单 — 下篇
  • (转)项目管理杂谈-我所期望的新人
  • .net 7和core版 SignalR