如何在Docker镜像中删除配置卷

9
我使用 docker run -it -v /xx1 -v /xx2 [image] /bin/bash 创建一个容器。
然后将其提交为镜像并推送到 Docker Hub。
使用 docker inspect [image] Volumes 的详细信息是:
"Volumes": {
            "/xx1": {},
            "/xx2": {}
        },

现在我想要在这个镜像中删除卷 /xx1。应该怎么做?

我在这里有同样的问题,经过多次尝试/错误和解释: https://dev59.com/Fabja4cB1Zd3GeqPfmZR 我猜这是做不到的? - Chris Mitchell
3个回答

4
我认为目前使用Docker工具不可能做到这一点。您不能从正在运行的容器中删除卷,或者如果您要在新的Dockerfile中使用您的映像作为基础,则无法删除继承的卷。
可能您可以使用Jérôme Petazzoni的nsenter工具手动删除容器内的挂载点,然后进行提交。您可以使用该方法将卷附加到正在运行的容器,但需要进行一些相当低级别的黑客攻击才能完成。

3

有一个解决方法,您可以使用 docker save image1 -o archive.tar 命令将 Docker 镜像保存为 tar 文件,然后编辑元数据 JSON 文件,最后使用 docker import -i archive.tar 命令导入镜像文件。这样就能保留历史记录和其他所有元数据。

为了帮助进行保存/解压/编辑/加载操作,我创建了一个小脚本,请查看docker-copyedit。特别针对您的问题,您可以执行:

./docker-copyedit.py from [image] into [image2] remove volume /xx1

0

删除卷的简单方法是导出并导入容器镜像:

  • docker run --name my-container -it [image] /bin/bash
  • docker export my-container > tarball
  • docker import tarball

真遗憾,导出/导入工具没有像魔法一样99%的时间都能正常工作。这就相当于从头开始编写Dockerfile。 - jiggunjer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接