使用提交以较小的更改更新docker镜像

时间:2014-09-24 10:24:30

标签: git commit docker

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

让我们说:

  • 我安装了一个web-app docker镜像,并将其部署到多个docker主机中。
  • 泊坞窗图片包含我的网络应用的源代码。
  • 我参与了代码,现在有了新版本的代码。

如何自动创建仅包含错误修复的最后一个图像上的新docker提交?

我的目标是只需要下载小的bugfix diff来获取已经下载过上一张图像的docker主机的新图像。

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

  • 我可能会以某种方式结束使用docker commit来保存图片中的更新。
  • 如何访问图片内容?
  • 即便如此,如何在不使用与Web应用程序无关的各种工具(git和shell脚本)混乱原始docker镜像的情况下导入我的更改?
  • 我查看了与另一个负责更新它的docker共享代码的卷。但是卷不会得到承诺。

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

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

1 个答案:

答案 0 :(得分:4)

以下是如何使用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相同的IMAGE_NAME   容器用。这将有效地更新您的图像。

  3. 其他问题:

    • 对上一张图像进行的任何修改都应尽量减少在最后一张图像上创建的新图层。规则可能取决于您是否正在使用BTRFS(块级修改实际上将在'层')或AUFS(文件级别修改)。最好的方法是避免使用相同的文件替换整个源文件(避免cp -agit checkout-index,支持rsyncgit checkout。)

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

    • 创建的图像不是正统的,不是来自Dockerfile。您应该从官方Dockerfile定期重建一个全新的图像。或者至少尝试通过将所有图像直接放在一张官方图像上来最小化分层。