我想利用 Docker 镜像的缓存/分层来节省带宽、磁盘空间和时间。
Let say:
- 我安装了一个 Web 应用程序 docker 映像并将其部署到多个 docker 主机中。
- docker 镜像包含我的网络应用程序的源代码。
- 我编写了代码,现在有了新版本的代码。
我应该如何自动化创建上一个图像上方的新 docker 提交仅包含错误修复?
我的目标是只需要下载小的错误修正差异即可为已经下载了先前映像的 docker 主机获取新映像。
这是我目前对此的反思:
- 我可能会结束使用
docker commit
以某种方式保存图像中的更新。
- But 我怎样才能访问图像内容?
- 即便如此,我如何导入我的更改而不用与服务 Web 应用程序无关的各种工具(git 和 shell 脚本)弄乱原始的 docker 图像?
- 我已经查看了与另一个负责更新代码的 Docker 共享代码的卷。但数量并没有得到承诺。
感谢您对如何实现这一目标的任何见解!
编辑:使用多个 Dockerfile 似乎是另一种方法,谢谢http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/ 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
.
如果您想在脚本中自动执行此操作,则需要获取容器
下一步的 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
容器与.这将有效地更新您的形象。
其他问题:
对先前图像进行的任何修改都应尽量减少在上一个图像上创建的新图层。规则可能取决于您是否使用 BTRFS(块级修改实际上将在“层”中)或 AUFS(文件级修改)。最好的办法是避免用相同的文件替换整个源文件(避免cp -a
, git checkout-index
, favor rsync
or git checkout
).
您需要在虚拟机上安装一些工具,以便可以进行更新(可能是git
, rsync
...)。但不要忘记,由于已安装的主机卷,您还可以提供脚本(甚至完整的工具)。
创建的图像不是正统的,也不是来自Dockerfile
。您可能应该定期从官方那里重建一个完整的新图像Dockerfile
。或者至少尝试通过让所有图像直接基于一张官方图像来最大程度地减少分层。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)