【问题标题】:Docker How to modify an existing imageDocker 如何修改现有镜像
【发布时间】:2019-07-04 03:37:45
【问题描述】:

我在 docker 中创建了一个图像。在其中安装了 Ubuntu、JDK 和其他几个库。然后我退出容器并进行了这样的提交

docker commit a7b95082f6ea anil-ubuntu

我又启动了容器

docker run -p 5901:5901 -t -i anil-ubuntu

这次我安装了 gradle 和其他几个库。然后退出容器并再次提交。

 docker commit a7b95082f6ea anil-ubuntu

每次我进行提交时,都会创建一个新图像,并保留带有存储库和标签的旧图像。按照这个工作流程,很快我就会用完空间。这是使用 docker 的正确方法吗?我如何确保所有这些图像消失。

我在 Windows 10 上使用 docker 版本 18.09.1 桌面

【问题讨论】:

  • 您可以使用 docker rmi 自己删除旧图像。为什么不使用 Dockerfile 一次性安装?
  • @Zak,如果我尝试删除旧图像,我会收到错误来自守护进程的错误响应:冲突:无法删除 4708b27e7571(无法强制)-图像具有依赖的子图像
  • 也许你应该先做一些清洁工作。删除所有容器,然后执行 docker system prune 删除悬空图像和卷。如果这不起作用,请查看stackoverflow.com/questions/38118791/…

标签: docker


【解决方案1】:

Docker 镜像是不可变的;一旦你创建了一个图像,你就不能再改变它了。

创建图像的正确方法是使用docker build。 Docker有一个相当不错的official tutorial on creating and running custom images;虽然它是面向 Python 的,但这里的基本技术适用于任何语言。

使用docker commit 几乎总是错误的。 Dockerfile 只是您用于构建映像的步骤的基本列表 - 启动 FROM 一些基本映像,COPY 在一些文件中,RUN 一些命令 - 通常编写 Dockerfile 就像写出在文本中构建图像所涉及的步骤。您还需要与需要此描述的其他人一起处理您的图像,并且当您开始使用的基本图像在六个月内具有关键的安全修复时,您需要自己记住如何你建造的。

我通常认为可行的工作流程是:

  1. 在本地构建和测试我的应用程序,完全不涉及 Docker
  2. 编写一个构建我的应用程序的 Dockerfile,其中没有任何开发或测试工具。检查它在本地docker runs 并手动测试它。将 Dockerfile 添加到我的源代码控制存储库。
  3. (可选但推荐)设置持续集成服务器和 Docker 注册表,以便在每次提交时,在本地单元测试通过后,构建一个新镜像并docker pushed。

是的,这会导致旧图像备份,但这并不是真正有害的。您可以使用docker system prune 清理它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 2016-08-16
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2010-09-19
    相关资源
    最近更新 更多