Docker镜像容器的迁移问题

2023-05-16

本文是本人项目踩坑经验,如有错漏请见谅!

背景需求:

一个已经配置好的容器(无build文件)需要部署到生产环境中,容器内有程序绑定了宿主环境的硬件信息。需求部署后能让第三方很难追溯回滚至镜像加密程序前的状态和加密程序本身以至于跳过保护措施。(镜像和宿主都是linux系统)

方案:

Docker除了build文件外,有2种导入导出命令组合。命令使用可参考Docker文档。这2种组合为:对镜像的save/load 和 对容器的export/import。其中export/import能很好的满足需求,export会导出容器在导出时的文件系统,相当于抹去了镜像的历史改动(layers)。

网上有很多export/import的例子,都是把原始的几乎无改动的容器如debian:latest导入导出,看上去很容易也都工作正常。实际拿自己项目的容器操作后发现很复杂,坑很多,前后费了我一周的时间才完全搞定。见坑如下:

坑1,export/import后的image没有任何配置参数,当然也无启动参数,大概率下按原来的启动凡是启动镜像必会出错。查询文档后,发现在import时可以设定CMD作为启动参数。(docker import)按Dockers的文档,在导入时可设定的参数很有限,实践后发现,导入时启动参数设定只能仅让新的image可以启动运行,并不意味着容器的功能都如导入前一样。如何让导入后的image能和导入前拥有相同的参数配置,见下文image配置修改。

坑2,这个是各大坑,本项目的镜像是一个运行在x64系统内的x86镜像。却在import后被系统自动设为amd64的架构。启动时,会遇到Unable to find image 'XXX' locally. 在最新的Docker官方文档里import新支持了--platform参数,但在本项目的系统版本内无官方解。解法见下文image配置修改。

坑3, 由于export会导出容器在导出时的文件系统,导出的数据包中也包含了容器系统运行时的文件。这些运行时文件可能会对导入后启动产生未知影响。本例中,/tmp/目录下有个某程序生成的lock文件,该lock文件的存在造成导入后再启动镜像时,程序认为已经启动而跳过启动。分析了很久才发现是/tmp/目录下的lock文件在随机次启动时会阻止相应程序启动。在清空导出包内的/tmp目录后重新导入,问题解决。该坑只能具体问题具体分析,建议在使用export/import时,在导入前应该过一遍导出数据包,清理一些linux典型的临时数据目录。

image配置修改方法(野路子办法)

  1. docker images 查看新导入的image ID备用
  2. 关闭docker service, systemctl stop docker.service
  3. cd /var/lib/docker/image/btrfs/imaged, 下列步骤中相对路径以此为基准
  4. 在content/sha256中找到对应的image ID的文件,文件为json格式,打开编辑,建议只作必要的修改,比如image的启动命令,平台架构,环境变量,完成后保存退出 (参考比较导出前的image的对应文件内容)
  5. 重新计算修改后ID配置文件的sha256 HASH, 运行命令sha256sum <image ID>
  6. 把ID配置文件用新的sha256 HASH重命名 mv <old HASH> <new HASH>
  7. 修改/var/lib/docker/image/btrfs/repository.json中的旧HASH为新HASH值
  8. 运行命令 stat -c ‘%y’ content/sha256/<new HASH> 获取新配置文件的修改时间戳
  9. 时间戳格式调整为 2023-03-27T20:48:02.401189138+08:00
  10. 重命名metadata/sha256/<old HASH>为metadata/sha256/<new HASH>
  11. 运行echo ‘2023-03-27T20:48:02.401189138+08:00’ | xargs echo -n > ./metadata/sha256/<new HASH>/lastUpdated
  12. 重新启动docker服务 systemctl start docker.service
  13. 可能启动后镜像名和版本会丢失,使用docker tag重新设定

希望对踩了类似坑的人有帮助~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker镜像容器的迁移问题 的相关文章

随机推荐

  • Android 7 Nougat 源码目录结构

    code style margin 0px auto font family none padding 0px color inherit background color transparent art Android Runtime x
  • 【无人驾驶规划】BOSS无人车规划算法

    无人驾驶规划 BOSS无人车规划算法 1 boss运动规划结构2 轨迹生成2 1 状态约束2 2 车辆模型2 3 控制参数化2 4 初始化轨迹2 5 轨迹优化 3 on road模式规划3 1 路径生成3 2 轨迹生成3 3 轨迹速度配置3
  • 这也太全面了 阿里王牌级“Docker全线笔记”,Github已标星80k+,我太爱

    写在开头 司汤达说过 xff1a 一个人只要强烈地坚持不懈地追求 xff0c 他就能达到目的 Docker的创始人Solomon Hykes就是以这样的精神 xff0c 在docker即将坚持不下去的时候 xff0c 选择的不是放弃 xff
  • 如何在keil5中新建.c和.h文件?

    有两种方法 xff1a 方法1 在keil5内部添加两个文件分别为 c和 h文件 xff0c 可以保存在一个新建的文件夹里 xff08 前提是此文件夹是在keil5内部保存时新建的文件夹 xff0c 而不是在keil5软件外自己新建的文件夹
  • CMake(十二):构建类型

    本章和下一章涉及两个密切相关的主题 构建类型 在某些IDE工具中也称为构建配置或构建方案 是一种高级控件 xff0c 它选择不同的编译器和链接器行为集 构建类型的操作是本章的主题 xff0c 而下一章将介绍控制编译器和链接器选项的更具体细节
  • CMake:构建、链接静态库和动态库

    CMake 构建 链接静态库和动态库 导言一 多目录多文件CMake构建方式1 项目结构2 message h3 message cpp4 hello world cpp5 CMakeLists txt6 构建及编译 二 静态库和动态库简介
  • msckf_mono构建运行方法

    背景 博主是在读Davide Scaramuzza投稿到ICRA 2018的VIO综述文章 A Benchmark Comparison of Monocular Visual Odometry Algorithms for Flying
  • IMU相关技术资料整理

    关于IMU噪声参数 xff1a IMU噪声参数模型的参考文档 xff1a https github com ethz asl kalibr wiki IMU Noise Model针对消费级IMU器件的噪声参数进行适度的不确定性放大 xff
  • Shell中空格引起的血案

    最近开始写点shell脚本 xff0c 对linux命令还是比较熟悉的 xff0c 但是shell脚本却没写过 xff0c 没想 xff0c 刚开始写 xff0c 就郁闷重重 各种语法错误 xff01 xff01 xff01 最简单的自定义
  • OpenCV-Python视频分析(移动物体检测,物体追踪)

    1 概述 该文章介绍OpenCV Python中关于视频分析的两个主要内容 xff0c 分别为 xff1a x1f41f 背景差分法移动物体检测 x1f41f Meanshift和Camshift算法物体追踪 PS xff1a 视频分析还要
  • 最新2014欢聚时代(YY)软件研发笔试题

    今天上午刚考完 C C 43 43 题目难度你们感受一下 xff01 总分80 43 60 61 140 题目上的答案请忽略
  • python 计算经纬度之间的距离

    def get distance lon1 lat1 lon2 lat2 lon1 lat1 lon2 lat2 61 map radians lon1 lat1 lon2 lat2 radians 角度转弧度 d lon 61 lon2
  • python多线程爬虫教学,清晰易懂。

    首先需要知道什么是多线程 xff0c 多线程的作用 首先举个例子 xff0c 并发和并行 xff1a 并发 xff1a 并发 xff0c 在操作系统中 xff0c 是指一个时间段中有几个程序都处于已启动运行到运行完毕之间 xff0c 且这几
  • Matlab 读取txt文本中的数据

    使用matlab读取txt文本中的数据 数据最好有一定的规律 我们可以使用函数importdata来导入数据 下面使用一个例子来说明该函数的使用 start path C 设置默认文件夹 filename pathname uigetfil
  • 2018-07-25-github-如何在Github上面创建Release

    github release 看别的Github项目都有一条类似timeline 时间线 的版本列表 xff0c 如下图 xff0c 所以在Github上面摸索了一下 xff0c 弄好了记录一下 创建一个Release TestBefore
  • SSH登录卡在‘Last login‘提示界面的一种原因

    以前解决过SSH登录卡顿的问题 xff0c 它一般来源于 xff1a GSSAPIAuthentication UseDNS 以上设置项被默认打开或意外打开 而这次遇到的问题不是卡顿 xff0c 而是卡在 Last login xff0c
  • 【云原生之Docker实战】使用Docker部署openwrt软路由

    云原生之Docker实战 使用Docker部署openwrt软路由 一 openwrt介绍 二 检查本地docker状态 1 查看docker版本 2 查看docker信息 3 查看本地docker网络 三 安装docker compose
  • 值得收藏:图解算法——动态规划系列

    个人博客导航页 xff08 点击右侧链接即可打开个人博客 xff09 xff1a 大牛带你入门技术栈 小浩 xff1a 宜信科技中心攻城狮一枚 xff0c 热爱算法 xff0c 热爱学习 xff0c 不拘泥于枯燥编程代码 xff0c 更喜欢
  • TensorFlow之循环神经网络&自然语言处理 学习总结

    作者 xff1a jliang https blog csdn net jliang3 junliang 20190303 说明 xff1a 以下所有代码使用版本TensorFlow1 4 0或1 12 0版本 import tensorf
  • Docker镜像容器的迁移问题

    本文是本人项目踩坑经验 xff0c 如有错漏请见谅 xff01 背景需求 xff1a 一个已经配置好的容器 xff08 无build文件 xff09 需要部署到生产环境中 xff0c 容器内有程序绑定了宿主环境的硬件信息 需求部署后能让第三