【问题标题】:Updating docker images with small changes using commits使用提交更新 docker 镜像
【发布时间】:2014-11-18 19:19:33
【问题描述】:

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

让我们说:

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

我应该如何自动创建在最后一个图像之上的新 docker 提交,只包含错误修复?

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

这是我目前对此的反思状态:

  • 我可能会以某种方式结束使用 docker commit 来保存图像中的更新。
  • 但是我怎样才能访问图像内容?
  • 即便如此,我如何导入我的更改,而又不使用与提供 Web 应用程序无关的各种工具(git 和 shell 脚本)弄乱原始 docker 映像?。
  • 我查看了与另一个负责更新代码的 docker 共享代码的卷。但不会提交卷。

感谢您提供有关如何实现此目的的任何见解!

编辑:使用多个 Dockerfile 似乎是另一种方法,谢谢http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/ 类似的问题。看来我需要即时生成我的 dockerfile。

【问题讨论】:

  • 如何将代码添加到图像中?
  • @Behe 我不明白你的问题,因为我已经说过这是我的问题的一部分。如果您的问题是关于首先添加代码(在更新应用程序之前),那么我正在考虑在自动构建中使用 ADD,如 dockerfile.github.io/#/python-runtime
  • 如果您使用 Dockerfile 并将 ADD 命令放在末尾,它应该会命中缓存,直到添加更改的内容,然后为新内容创建一个新层。这听起来有帮助吗?
  • 一种利用 docker 镜像分层来节省带宽、磁盘空间和花费的时间并自动在仅包含更改的文件的最后一个镜像之上创建新的 docker commit 的解决方案可在此处获得:stackoverflow.com/a/36561768/682317

标签: git commit docker


【解决方案1】:

以下是使用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 -agit checkout-index、支持rsyncgit checkout)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2022-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多