使用提交更新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
更新现有的图像。
-
用你想修改的图片启动一个容器:
docker run -t -i IMAGE /bin/bash
请注意,您可能需要访问一些主机文件/目录来导入容器中的更改:
docker run -t -i -v /host/location:/mnt/share IMAGE /bin/bash
然后用Ctrl-D
exit
或exit
。如果您想在脚本中自动执行此操作,则需要获取下一步的容器标识。 你会直接发出命令而不是调用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 ")
-
提交您的修改的容器文件系统作为一个新的形象:
docker commit CONTAINER_ID IMAGE_NAME
请注意:您可能想要使用与首次启动容器的IMAGE_NAME相同的IMAGE_NAME。 这将有效地更新您的图像。
其他问题:
-
对前一张图像进行的任何修改都应尽量减less上一张图像上创build的新图层。 如果使用BTRFS(块级别修改实际上将在“图层”中)或AUFS(文件级别修改),规则可能取决于。 最好的办法是避免使用相同的文件replace整个源文件(避免
cp -a
,git checkout-index
,rsync
或git checkout
)。 -
你需要在你的虚拟机上安装一些工具,这样你才能进行更新(可能是
git
,rsync
…)。 但是不要忘记,由于安装的主机卷,您还可以提供脚本(甚至是完整的工具)。 -
创build的图像不是正统的,不是来自
Dockerfile
。 你应该从一个官方的Dockerfile
定期重build一个全新的镜像。 或者至less尝试通过让所有图像直接基于一个官方图像来最小化分层。