我想利用docker镜像的缓存/分层来节省带宽,磁盘空间和花费的时间。
让我们说:
如何自动创建仅包含错误修复的最后一个图像上的新docker提交?
我的目标是只需要下载小的bugfix diff来获取已经下载过上一张图像的docker主机的新图像。
这是我目前关于它的反思:
docker commit
来保存图片中的更新。感谢您对如何实现这一目标的任何见解!
编辑:使用多个Dockerfile似乎是另一种方法,对于类似的问题,thx http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/。我似乎需要动态生成dockerfiles。
答案 0 :(得分:4)
以下是如何使用docker commit
更新现有图片。
启动包含您要修改的图片的容器:
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
")
将修改后的容器文件系统作为新映像提交:
docker commit CONTAINER_ID IMAGE_NAME
注意:您可能希望使用与首次启动的IMAGE_NAME相同的IMAGE_NAME 容器用。这将有效地更新您的图像。
其他问题:
对上一张图像进行的任何修改都应尽量减少在最后一张图像上创建的新图层。规则可能取决于您是否正在使用BTRFS(块级修改实际上将在'层')或AUFS(文件级别修改)。最好的方法是避免使用相同的文件替换整个源文件(避免cp -a
,git checkout-index
,支持rsync
或git checkout
。)
您需要在VM上安装一些工具才能进行更新(可能是git
,rsync
...)。但是不要忘记你也可以提供脚本(甚至是完整的工具),这要归功于安装的主机卷。
创建的图像不是正统的,不是来自Dockerfile
。您应该从官方Dockerfile
定期重建一个全新的图像。或者至少尝试通过将所有图像直接放在一张官方图像上来最小化分层。