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

vaa*_*aab 10 git commit docker

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

让我们说:

  • 我安装了一个web-app docker镜像,并将其部署到多个docker主机中.
  • docker镜像包含我的Web应用程序的源代码.
  • 我研究了代码,现在有了新版本的代码.

我应该如何在仅包含bugfix的最后一个图像上自动创建新的docker commit

我的目标是只需要下载小的bugfix diff来获取已下载前一个图像的docker主机的新图像.

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

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

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

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

vaa*_*aab 5

这是使用来更新现有图像的方法docker commit

  1. 使用您要修改的图像启动一个容器:

      docker run -t -i IMAGE /bin/bash
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,您可能需要访问一些主机文件/目录以将更改导入容器:

      docker run -t -i -v /host/location:/mnt/share IMAGE /bin/bash
    
    Run Code Online (Sandbox Code Playgroud)

    然后使用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
        ")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将修改后的容器文件系统作为新映像提交:

       docker commit CONTAINER_ID IMAGE_NAME
    
    Run Code Online (Sandbox Code Playgroud)

    注意:您可能要使用与首次启动容器时使用的IMAGE_NAME相同的名称。这将有效地更新您的图像。

其他问题:

  • 对先前图像进行的任何修改都应尽量减少在最后一个图像上创建的新层。规则可能取决于您使用的是BTRFS(块级修改实际上将在“层”中)还是AUFS(文件级修改)。最好是避免使用相同的文件(避免更换整个源文件cp -agit checkout-index,赞成rsyncgit checkout)。

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

  • 创建的图像不是正统图像,也不来自Dockerfile。您可能应该定期从官员那里重建一个全新的形象Dockerfile。或者至少通过使所有图像直接基于一张正式图像来尽量减少分层。