使用提交更新docker图像的小改动

我想利用caching/分层docker图像来节省带宽,磁盘空间和时间。

假设:

  • 我有一个Web应用程序泊坞窗图像安装和部署到几个docker主机。
  • 泊坞窗图像包含我的networking应用程序的源代码。
  • 我工作的代码,现在有一个新版本的代码。

我应该如何自动创build一个新的docker提交上面的最后一个图像只包含错误修正?

我的目标是只需要下载一个小的bugfix diff来获取已经下载了以前映像的docker主机的新映像。

这是我目前关于它的反思的状态:

  • 我可能会结束使用docker commit以某种方式保存图像中的更新。
  • 但是,我怎样才能访问图像内容?
  • 即使如此,我将如何导入我的更改,而不会混淆与原来的泊坞窗图像与各种工具(git和shell脚本)无关的服务的web应用程序?
  • 我已经看过卷来与另一个docker分享这个代码,这个Docker会负责更新它。 但卷不承诺。

感谢任何有关如何实现这一目标的见解!

编辑:使用多个Dockerfile似乎另一种方式来做到这一点,thj 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 exitexit

    如果您想在脚本中自动执行此操作,则需要获取下一步的容器标识。 你会直接发出命令而不是调用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相同的IMAGE_NAME。 这将有效地更新您的图像。

其他问题:

  • 对前一张图像进行的任何修改都应尽量减less上一张图像上创build的新图层。 如果使用BTRFS(块级别修改实际上将在“图层”中)或AUFS(文件级别修改),规则可能取决于。 最好的办法是避免使用相同的文件replace整个源文件(避免cp -agit checkout-indexrsyncgit checkout )。

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

  • 创build的图像不是正统的,不是来自Dockerfile 。 你应该从一个官方的Dockerfile定期重build一个全新的镜像。 或者至less尝试通过让所有图像直接基于一个官方图像来最小化分层。

Interesting Posts