比如我要基于官方镜像添加扩展,安装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
如何解决?
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 。