【问题标题】:How to catch changes in building docker image?如何捕捉构建 docker 镜像的变化?
【发布时间】:2017-09-07 07:00:15
【问题描述】:

我是 docker 容器的新手。我遇到了一个关于如何捕获我的代码更改的问题。我的本地 style.css 文件中的某些行已更改。然后我再次构建了 docker 镜像,但是当我浏览我的应用程序时实际上没有任何变化。

以下是我在网上找到并尝试过的一些方法,但没有奏效。

  1. 删除映像并重新构建
  2. --no-cache=true
  3. 在 Dockerfile 中添加注释以使其与众不同
  4. docker 系统修剪
  5. --拉

(我也使用 git pull 在我的云实例上获取代码,这些文件被检查为最新的。)

我对docker机制知之甚少,谁能告诉我是什么问题?

我发现的额外信息:
停止容器并删除映像后,我重新启动实例,然后构建映像,再次运行容器。只有这样,我才能捕捉到那些变化。有谁知道这个问题?

非常感谢!

【问题讨论】:

  • 你更换了正在运行的容器吗?
  • 是的。我发现只有当我停止运行容器、容器修剪、删除映像并停止我的实例,然后再次启动我的实例、再次构建、运行容器时,我才能捕捉到这些变化。你能通过这些信息找出确切的问题吗?

标签: docker deployment dockerfile


【解决方案1】:

容器和图像之间的区别似乎存在脱节。容器是应用程序的运行实例。它基于您已经构建的图像。该图像有一个更容易引用的标签,但对图像的真正引用是 sha256 哈希,构建新图像将更改标签指向的哈希,而不会影响任何正在运行的容器。

因此,在 docker 中更新正在运行的应用程序的工作流程是:

  1. 构建新映像
  2. 停止正在运行的容器
  3. 启动一个指向该图像的新容器
  4. 清理所有旧图像或停止的容器

如果您使用 docker-compose,它会使用 docker-compose up 命令自动执行中间两个步骤,甚至会删除旧容器。大多数用户会保留一些旧图像的副本以方便回滚。

【讨论】:

  • 我按照你的步骤做了,但是当我构建一个新镜像时,我看到 docker 正在使用缓存,结果和我之前停止的那个容器完全一样。然后我尝试在构建中添加--no-cache,仍然没有任何改变。
  • 顺便说一句,我不使用 docker-compose。我在我的文件夹中添加了一个 Dockerfile,然后是 docker build , docker run。就这样。我也尝试了不同的图像标签,也没有工作。总的来说,必须有一些东西决定在我不知道的 docker 中构建图像时使用什么,而不仅仅是我 cd 到的文件夹。只有重新启动整个实例,它似乎清理了一些 docker 保存的东西,然后我才能捕捉到我所做的那些更改。你知道它是什么吗? (操作系统:Linux 14.04,docker 版本:17.06.2-cd)
  • 如果图像被完全缓存,那么您的 css 文件与上次构建相比没有变化,或者没有包含在您的图像中,使用 COPYADD 命令。
  • 终于找到了问题所在。我检查了图像 ID,每次更改某些内容时,都会分配一个新 ID。如果我没有更改任何内容,则此 ID 将与以前的 ID 相同。然后我执行到容器,发现我所做的那些改变意味着容器被改变了,但是我浏览器中的页面看起来没有改变。我意识到问题可能是浏览器缓存!清理浏览器缓存后,我发现了我的更改。感谢您的回复,了解有关 docker 的更多信息总是很高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2020-06-02
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2021-02-27
  • 2017-10-03
相关资源
最近更新 更多