请考虑以下情形。有一个依赖于库“ A”,“ B”,“ C”来构建和运行的应用程序,否则会引发错误。不了解依赖项“ B”和“ C”,将创建一个Dockerfile,该文件将构建安装了依赖项“ A”的映像。
该应用程序在从映像开始的容器中运行,并且该应用程序无法构建,因为该容器缺少依赖项“ B”和“ C”。
现在,如果映像被销毁并重建,则先前下载的依赖项将再次重新下载。一种解决方法是编写一个Dockerfile从现有映像(已安装依赖项“ A”)导入,并在其之上提到安装依赖项“ B”和“ C”。
但是这样,每次需要添加新的依赖项时,都必须构建一个新的docker映像,该映像将从旧映像中导入,因此,旧映像和新映像都仍然很重要。
我的问题是
对于这种情况,最干净的解决方案是什么?
答案 0 :(得分:0)
1。是否有任何方法可以使构建映像中提及新的依赖项而无需重新下载旧的依赖项?
好吧,我经常使用层缓存来优化Dockerfile。每当您在Dockerfile中写下命令时,它都会创建一个新层。在两次构建之间,docker将自上而下比较Dockerfile的命令,并从检测到命令更改的位置进行重新构建。因此,我经常在dockerfile的顶部放置稳定层(如依赖项,环境设置)。否则,我经常更改的图层(例如EXPOSE Port或CMD)会放在文件底部。这样,每当我重建映像时,它可以节省大量时间。
您还可以使用多阶段构建。但是我并不经常使用它,因此您可以在这里进行检查:https://docs.docker.com/develop/develop-images/multistage-build/
2。而不保留旧图像并将其导入新图像?
有时候我想重新安装所有内容时,我只是重建映像使用选项--no-cache。**
docker build --no-cache=true .
3。无需在dockerfile中编写新的“ FROM”
有时我会使用像linux alpine这样的基本映像,并从头开始安装我需要的所有内容,因此我的映像将具有较小的尺寸,并且不包含我不需要的东西。 FROM只是从Dockerhub中提取以某种方式创建的图像。
例如图像nginx-alpine的Dockerfile: https://github.com/nginxinc/docker-nginx/blob/2ef3fa66f2a434cd5e44e35a02f4ac502cf50808/mainline/alpine/Dockerfile
您可以检出Alpine Linux以获得更多详细信息:https://alpinelinux.org/