基于PHP官方镜像构建的新镜像为啥会多一层变成2个镜像?

发布于 2022-09-11 23:01:49 字数 2259 浏览 18 评论 0

比如我要基于官方镜像添加扩展,安装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基础上加的:
WechatIMG3482.png

疑问,如果我想只有一个镜像要如何操作?只能基于操作系统的基础镜像源码安装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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怎樣才叫好 2022-09-18 23:01:49

docker build 过程中会生成很多镜像,不只是 FROM 后面的基础镜像。

所有这些镜像都不会自动删除,并且你在重新执行 docker build 是,会复用没有变化的镜像,而不是构建新的。

你已经不需要它们了,可以手工删掉。

貌似有 tag 的 image 是没法通过 rmi <image_id> 来删掉的。同时 docker build 产生的中间 image ,如果它是某一个有 tag image 的 parent ,也是无法删掉的。

但是,有人提到可以先把 image 导出来,然后删掉所有,在把 image 导进来,来干掉中间image

#导出
docker save --output image.tar ImageID-or-Name

##########删掉已经导出的 image ,和所用中间 image #######
# ............

#导入
docker load --input image.tar

======

可以同过 ocker rmi $(docker images --filter "dangling=true" -q --no-trunc) 来删掉没有被引用的中间 image 。

内心激荡 2022-09-18 23:01:49

这叫中间镜像,也叫临时镜像

docker build 是分 layer 的,你可以近似理解成每个 RUN 都会生成一个镜像出来。

这样做的好处是可以增量更新。

比如你现在把这个 Dockerfile 已经构建成镜像了,现在又想 apt-get install 一个新依赖,那么只需前面都保持不变、在结尾追加新的命令,docker build 会自动跳过前面已经构建过的部分,只从新增的部分开始执行,大大节省时间(要是前面编译过大型 C/C++ 项目你就懂了,构建一次个把小时很正常)。

如果你是不想生成很多中间镜像,可以把所有 RUN 都合并成一个就行了。

或者是像 https://blog.csdn.net/feiniao... 这里提到的这样删除就好了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文