更新Dockerfile中的依赖项并创建映像,而无需重新下载前面提到的依赖项

更新Dockerfile中的依赖项并创建映像,而无需重新下载前面提到的依赖项,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,考虑以下场景。有一个应用程序依赖于库“A”、“B”、“C”来构建和运行,否则会抛出错误。由于不知道依赖项“B”和“C”,因此创建了一个Dockerfile,用于构建安装了依赖项“a”的映像。 应用程序在从映像启动的容器中运行,并且应用程序无法生成,因为容器缺少依赖项“B”和“C”。 现在,如果映像被销毁并重建,以前下载的依赖项将再次被重新下载。一种解决方法是编写一个Dockerfile以从现有映像(已安装依赖项“A”)导入,并在其顶部提到安装依赖项“B”和“C”。 但是通过这种方式,每次需

考虑以下场景。有一个应用程序依赖于库“A”、“B”、“C”来构建和运行,否则会抛出错误。由于不知道依赖项“B”和“C”,因此创建了一个Dockerfile,用于构建安装了依赖项“a”的映像。

应用程序在从映像启动的容器中运行,并且应用程序无法生成,因为容器缺少依赖项“B”和“C”。

现在,如果映像被销毁并重建,以前下载的依赖项将再次被重新下载。一种解决方法是编写一个Dockerfile以从现有映像(已安装依赖项“A”)导入,并在其顶部提到安装依赖项“B”和“C”。

但是通过这种方式,每次需要添加新的依赖项时,都必须构建一个新的docker映像,该映像将从旧映像导入,因此,旧映像和新映像仍然很重要。

我的问题是

  • 如果有任何方法可以继续构建提及新依赖项的图像,而不重新向下隐藏旧依赖项
  • 不从旧映像导入依赖项
  • 而且,不用麻烦在dockerfile中写一个新的“FROM”

  • 对于这种情况,什么是最干净的解决方案?

    1。是否有任何方法可以在不重新下载旧依赖项的情况下不断生成提及新依赖项的映像?

    嗯,我经常使用层缓存优化Dockerfile。无论何时在Dockerfile中写入命令,它都会创建一个新层。在2次生成之间,docker将Dockerfile的命令从上到下进行比较,并从中检测命令的更改。所以我经常在dockerfile的顶部放置稳定的层(如依赖项、环境设置)。否则,像EXPOSE Port或CMD这样的层我经常更改,所以我将它们放在文件的底部。通过这样做,我在重建图像时节省了很多时间

    您还可以使用多级构建。但我不经常使用它,因此您可以在此处查看:

    2。不保留旧图像并将其导入新图像?

    有时,当我想重新安装所有东西时,我只需要使用选项重建图像——无缓存**

    docker build --no-cache=true .
    
    3。无需在dockerfile中写入新的“发件人”

    有时我会使用linux alpine之类的基本映像,从头开始安装我需要的所有东西,这样我的映像就会更小,并且不包含我不需要的东西。FROM只是从Dockerhub中提取通过某种方式创建的图像

    例如,图像nginx alpine的Dockerfile:

    您可以签出alpine linux以了解更多详细信息: