使用提交更新 docker 镜像并进行小的更改

2024-04-06

我想利用 Docker 镜像的缓存/分层来节省带宽、磁盘空间和时间。

Let say:

  • 我安装了一个 Web 应用程序 docker 映像并将其部署到多个 docker 主机中。
  • docker 镜像包含我的网络应用程序的源代码。
  • 我编写了代码,现在有了新版本的代码。

我应该如何自动化创建上一个图像上方的新 docker 提交仅包含错误修复?

我的目标是只需要下载小的错误修正差异即可为已经下载了先前映像的 docker 主机获取新映像。

这是我目前对此的反思:

  • 我可能会结束使用docker commit以某种方式保存图像中的更新。
  • But 我怎样才能访问图像内容?
  • 即便如此,我如何导入我的更改而不用与服务 Web 应用程序无关的各种工具(git 和 shell 脚本)弄乱原始的 docker 图像?
  • 我已经查看了与另一个负责更新代码的 Docker 共享代码的卷。但数量并没有得到承诺。

感谢您对如何实现这一目标的任何见解!

编辑:使用多个 Dockerfile 似乎是另一种方法,谢谢http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/ http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/对于类似的担忧。看来我需要动态生成我的 dockerfiles。


以下是如何更新现有图像docker commit.

  1. 启动一个包含您要修改的映像的容器:

      docker run -t -i IMAGE /bin/bash
    

    请注意,您可能需要访问一些要导入的主机文件/目录 容器的变化:

      docker run -t -i -v /host/location:/mnt/share IMAGE /bin/bash
    

    然后使用 Ctrl-D 退出或exit.

    如果您想在脚本中自动执行此操作,则需要获取容器 下一步的 id。你会想直接发出命令而不是 调用 bash 的交互式会话:

      container_id=$(docker run -d -v /host/location:/mnt/share IMAGE /bin/bash -c "
            ## any bash code
            rsync -av --delete --exclude .git /mnt/share /my/app/
            cd /my/app
            ./autogen.sh
        ")
    
  2. 将修改后的容器文件系统作为新映像提交:

       docker commit CONTAINER_ID IMAGE_NAME
    

    注意:您可能想要使用与第一次启动时相同的 IMAGE_NAME 容器与.这将有效地更新您的形象。

其他问题:

  • 对先前图像进行的任何修改都应尽量减少在上一个图像上创建的新图层。规则可能取决于您是否使用 BTRFS(块级修改实际上将在“层”中)或 AUFS(文件级修改)。最好的办法是避免用相同的文件替换整个源文件(避免cp -a, git checkout-index, favor rsync or git checkout).

  • 您需要在虚拟机上安装一些工具,以便可以进行更新(可能是git, rsync...)。但不要忘记,由于已安装的主机卷,您还可以提供脚本(甚至完整的工具)。

  • 创建的图像不是正统的,也不是来自Dockerfile。您可能应该定期从官方那里重建一个完整的新图像Dockerfile。或者至少尝试通过让所有图像直接基于一张官方图像来最大程度地减少分层。

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

使用提交更新 docker 镜像并进行小的更改 的相关文章

随机推荐

  • 如何重启虚拟机?

    如果我想运行另一个版本的tensorflow或keras 那么我可以安装特定版本的相同版本 但之后我想回滚到最新版本 并使用最新版本 例如1 6 0rc 再次安装tensorflow 它正在安装 但是当我再次检查版本时 它仍然指向早期版本的
  • 迦太基和谷歌地图

    是否可以通过 Carthage 安装 GoogleMap SDK 我只看到了 Cocoapods 的教程 或者如果我使用 Carthage 我只能手动安装 根据迦太基文档 https github com Carthage Carthage
  • 在Python中重命名目录中的多个文件

    我正在尝试使用 Python 重命名目录中的一些文件 假设我有一个名为CHEESE CHEESE TYPE 并想要删除CHEESE 所以我得到的文件名是CHEESE TYPE 我正在尝试使用os path split但它不能正常工作 我也考
  • 使用背景校正图像 (Python)

    我正在开发一个项目 对标签上的文本进行 OCR 操作 我的工作是对图像进行倾斜校正 使其可以用超正方体读取 I have been using this approach https www pyimagesearch com 2017 0
  • WooCommerce 在产品页面上的外部产品的“添加到购物车”按钮上显示价格

    我正在尝试将价格添加到外部产品的产品详细信息页面上的添加到购物车按钮 100 立即购买 而不是 但是现在 希望对此处提出的问题进行类似的修改 WooCommerce 在 添加到购物车 按钮上显示价格 https stackoverflow
  • 我可以在具有删除规则的关系的实体上使用 NSBatchDeleteRequest 吗?

    我正在尝试使用 NSBatchDeleteRequest 删除一堆实体 其中许多实体具有删除级联和 或无效规则 我第一次尝试删除任何内容失败 并且返回的 NSError 包含字符串 批量删除不支持删除规则 我原以为删除这些东西很好 但我有责
  • 如何使用 Angular 在 vi​​s.js 中实现网络可视化?

    我已经通过以下方式安装了我需要的依赖项 vis js npm install vis save 类型 可见 npm install types vis save dev 代码片段 import Component AfterViewInit
  • invokedynamic 什么时候真正有用(除了惰性常量之外)?

    TL DR 请提供一段用一些众所周知的动态语言 例如 JavaScript 编写的代码 以及该代码在使用 invokedynamic 的 Java 字节码中的样子 并解释为什么使用 invokedynamic 是一个进步 背景 我在 goo
  • 如何对 axios 响应拦截器进行自定义错误代码检查?

    我在我的应用程序中使用 graphql 它错误地发送以下响应 您可能已经注意到 graphql 将所有错误作为状态代码 200 发送 我从 API 返回的错误位于data errors data errors message Error T
  • 剃刀组件中的 C# StateHasChanged() 不会强制

    我正在尝试服务器端 blazor 我正在尝试使用多个按钮设置 更改在剃刀组件的标签中播放的 mp4 文件 我发现实现这项工作的唯一方法是通过 IJSRuntime InvokeVoidAsync 从我的 razor 组件中的 OnParam
  • Webpack 图像文件夹

    我对 webpack 还很陌生 当我部署时我基本上得到了JS文件和一堆在同一文件夹中像这样乱码的图像 我愿意为此not即将发生 我想让图像文件保留它们的名称 因为在我的 javascript 中 我想动态加载图像文件以及资源文件中的其他内容
  • 在威特的最后...Javascript不会取代'\n'!

    我已经研究这个问题好几个小时了 但运气为零 不知道这怎么可能 我会尝试总结一下 我正在使用 TinyMCE 将新内容插入数据库 该内容在插入数据库后作为 AJAX 响应发送回 然后显示在页面上 替换一些旧内容 所有这些都与问题无关 据我所知
  • 如何在父 DIV 容器中移动 DIV 并调整其大小而不溢出?

    let isSelecting false let selectionStartX selectionStartY selectionEndX selectionEndY let selectionRectangle let dragged
  • iphone:(音频)发布消息以杀死 mediaserverd

    我正在使用以下方法播放几种声音 音频服务 https developer apple com library mac documentation AudioToolbox Reference SystemSoundServicesRefer
  • 如何在VB.net中读取PDF文件或在VB.net中将PDF转换为word文档

    我需要使用 VB net 编写的应用程序阅读 PDF 中的文本 目前最好的方法是什么 我也愿意先将 PDF 转换为 Word 文档 然后阅读 iTextPdf 看起来是一个很好的起点 开源和 C 所以任何示例都应该可以移植到 vb net
  • 如何以编程方式接收超过 10 条亚马逊 SQS 消息

    我们有 SQS 标准消息队列 并且它的增长速度非常快 大多数时候我们都会收到旧的通知 我们已将消息保留期配置为 2 天 有没有办法以编程方式接收超过 10 条消息 以下是我从亚马逊恢复 SQS 消息的代码 private IEnumerab
  • 反斜杠零分隔符 '\0'

    我见过 0 用作混合二进制文件 UTF8 字符串 二进制数据 中的分隔符 谁能解释一下什么 0 意味着或指向一个好的学习场所 这是空字符 更多信息请参见此维基百科article http en wikipedia org wiki Null
  • 重置页面上的所有复选框而不循环

    我想知道是否可以在不使用 jQuery 循环的情况下重置页面上的所有复选框 将它们标记为未选中 您可以使用单个选择器查找所有选中的复选框 并从中删除 checked 属性 jQuery 将通过循环在内部完成此操作 但您不必自己编写循环 ch
  • Javascript -Uncaught 承诺被拒绝,即使它已经被拒绝

    我正在运行这个 Parse com 云代码作业 它查询我的一个类并获取 url 然后我读取这些 url 它们是 xml 文件 然后从其中获取一些数据并将其保存以进行解析 从代码中可以看出 这是代码 完整代码在这里gist github co
  • 使用提交更新 docker 镜像并进行小的更改

    我想利用 Docker 镜像的缓存 分层来节省带宽 磁盘空间和时间 Let say 我安装了一个 Web 应用程序 docker 映像并将其部署到多个 docker 主机中 docker 镜像包含我的网络应用程序的源代码 我编写了代码 现在