基于PHP官方镜像构建的新镜像为啥会多一层变成2个镜像?
比如我要基于官方镜像添加扩展,安装NMP,compose等。。
下面的代码只是举个例子:
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
RUN pecl install redis-4.0.1 \
&& pecl install xdebug-2.6.0 \
&& docker-php-ext-enable redis xdebug
构建成功后 docker images可以看到有两个镜像,403MB的就是PHP官方的,433MB的肯定 是在403MB基础上加的:
疑问,如果我想只有一个镜像要如何操作?只能基于操作系统的基础镜像源码安装PHP+扩展+其它软件?
=========3小时后补充========
JZTech-huangweihong:dockerimages huangwh$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
myphp7.2 latest b621e8a65bc7 20 seconds ago 429MB
<none> <none> 17520e2424c0 About a minute ago 423MB
php 7.2-fpm 1b212482a575 19 hours ago 398MB
registry.cn-beijing.aliyuncs.com/anythink/esd latest 1f33962d3dcc 2 months ago 483MB
JZTech-huangweihong:dockerimages huangwh$ docker ps -al
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
JZTech-huangweihong:dockerimages huangwh$ docker rmi 17520e2424c0
Error response from daemon: conflict: unable to delete 17520e2424c0 (cannot be forced) - image has dependent child images
JZTech-huangweihong:dockerimages huangwh$ docker rmi 1b212482a575
Error response from daemon: conflict: unable to delete 1b212482a575 (cannot be forced) - image has dependent child images
前面2楼的朋友回复说可以删除中间镜像的,但事实上是不能的。或者我的就不是临时镜像,有依赖关系?我删除时提示:Error response from daemon: conflict: unable to delete 1b212482a575 (cannot be forced) - image has dependent child images
如何解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
docker build 过程中会生成很多镜像,不只是 FROM 后面的基础镜像。
所有这些镜像都不会自动删除,并且你在重新执行 docker build 是,会复用没有变化的镜像,而不是构建新的。
你已经不需要它们了,可以手工删掉。貌似有 tag 的 image 是没法通过 rmi <image_id> 来删掉的。同时 docker build 产生的中间 image ,如果它是某一个有 tag image 的 parent ,也是无法删掉的。
但是,有人提到可以先把 image 导出来,然后删掉所有,在把 image 导进来,来干掉中间image
======
可以同过
ocker rmi $(docker images --filter "dangling=true" -q --no-trunc)
来删掉没有被引用的中间 image 。这叫中间镜像,也叫临时镜像。
docker build
是分 layer 的,你可以近似理解成每个RUN
都会生成一个镜像出来。这样做的好处是可以增量更新。
比如你现在把这个 Dockerfile 已经构建成镜像了,现在又想
apt-get install
一个新依赖,那么只需前面都保持不变、在结尾追加新的命令,docker build
会自动跳过前面已经构建过的部分,只从新增的部分开始执行,大大节省时间(要是前面编译过大型 C/C++ 项目你就懂了,构建一次个把小时很正常)。如果你是不想生成很多中间镜像,可以把所有
RUN
都合并成一个就行了。或者是像 https://blog.csdn.net/feiniao... 这里提到的这样删除就好了。