【问题标题】:How upgrade a docker image without creating new image?如何在不创建新镜像的情况下升级 docker 镜像?
【发布时间】:2017-04-09 01:14:36
【问题描述】:

这似乎是我找不到答案的最简单的问题。

  1. 我构建了一个 docker 映像。
  2. 运行docker images 表明它存在。
  3. 然后我在 Docker 文件中添加一个新行。
  4. 然后我重建图像。
  5. 旧图像仍在 docker images 中,现在有一个新图像。

如何简单地更新旧图像而不创建新图像?

我的 docker 命令:docker build -t nick_app . --force-rm --no-cache

(注意:我只是扔掉了那些 --force-rm 命令和 --no-cache 命令',因为它似乎可以工作。)

之前:

Dockerfile:

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y
CMD ["echo", "Sup"]

docker 图像命令:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nick_app            latest              421662154c3f        9 minutes ago       746.9 MB
ruby                2.3.3               d00ebde6a601        2 days ago               730.1 MB
hello-world         latest              c54a2cc56cbb        4 months ago          1.848 kB

之后: Dockerfile:

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y \
   build-essential
CMD ["echo", "Sup"]

docker 图像命令:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nick_app            latest              bcf9b3667202        3 seconds  ago       746.9 MB
<none>              <none>              421662154c3f        10 minutes ago      746.9 MB
ruby                2.3.3               d00ebde6a601        2 days ago          730.1 MB
hello-world         latest              c54a2cc56cbb        4 months ago        1.848 kB

我所做的每个 dockerfile 更改都会在重建时创建一个新的 none 图像。它们是累积的,所以每次我进行更改和重建时,我都会得到另一个 none 图像。

每次我更改 dockerfile 时,如何摆脱中间的 none

【问题讨论】:

  • 毕竟,您正在创建图像的新版本,所以发生的事情是有意义的。您必须以某种方式包装它,即有一个您调用的 bash 脚本,而不是直接调用 docker build(在答案中使用命令 show)。
  • 这很有意义,当我对文本文件进行更改时,它在技术上是文本文件的新版本,但文字处理器仍会在不创建中间文件的情况下处理就地更新新文本文件。似乎这对于 Docker 应用程序窥视可能是一个有用的案例:如果我使用相同的标签重建假设它将是相同的图像并删除所有中间/旧版本。

标签: docker dockerfile


【解决方案1】:

那些&lt;none&gt;:&lt;none&gt; 实际上是您的应用程序的旧版本,因为您将nick_app:latest 移到了新版本,所以它已经丢失了它的命名指针。

在构建图像时,我认为您不能告诉它破坏旧图像,它只会创建一个新图像。 但是有一个命令可以帮助您列出或删除那些悬空的图像:

docker images --filter dangling=true #lists all images that are dangling and has no pointer to it
docker rmi `docker images --filter dangling=true -q` #Removes all those images.

【讨论】:

  • 感谢您的信息。不喜欢没有标志或选项可以自动执行此操作。这似乎是一个非常常见的用例。我有捷径docker rmi $(docker images -f "dangling=true" -q),但每次重建都必须这样做似乎有点不雅。
  • dicker image rmdocker rmi有区别吗?
  • @CpILL 它是 docker,而不是 dicker,哈哈。 docker rmi 就是把 id 相同,但是标签不同的镜像去掉。而 docker image rm 是移除 docker 镜像,不属于上述场景。
猜你喜欢
  • 2016-08-16
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 2020-04-06
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
相关资源
最近更新 更多