最近有一个需求需要手动的构建一个docker镜像,遇到了一些docker的坑,记录一下:
1. 使用centos的镜像无法使用yum安装
dockerfile构建,但是里面的yum死活执行不了,无法连接上centos的官方镜像库。提示如下错
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was
其中dockerfile如下:
FROM centos:7
···
ENV PYTHONIOENCODING=utf-8
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
ENV FLASK_RUN_PORT 5051
CMD ["gunicorn", "app:app", "-c", "gun.conf"]
原因就在于第一句的,FROM centos:7,我本地所连接的镜像仓库使用的是默认仓库,这个仓库里面的centos是精简版的,并不内置yum
解决办法,换一个镜像仓库,这里使用阿里云的加速:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://c8it25aj.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload && systemctl restart docker
然后构建Dockerfile,就变得6的一批了。
2. 一个简单的RPC服务,竟然构建出来的镜像1.5G
看到原始的FROM镜像才200MB,猜测构建镜像的大小无非两个:
- 容器构建的方法的问题
- 容器内安装的程序和文件增加了镜像大小
(1) 首先想到的是,会不会是因为RUN的层数太多,后面的container合并的时候会导致镜像变大
然后把RUN合并成为一个,把能够合并的命令合并成一个,开始通过dockerfile构建docker镜像,最后发现,并没有卵用,镜像还是那么大。
为此还继续做了排除实验,即仅仅保留FROM centos以及一个COPY方法,构建出来的docker image大小大概等于:centos源镜像大小+COPY文件的大小
结论:
- Dockerfile的RUN是会产生一层container去执行命令,而且不同的RUN之间文件层级是隔离的,RUN写的太多只会影响构建的速度,并不会影响最终构建出来的image大小。
- Docker镜像的大小只与Docker容器内的文件大小有关,与构建方法无关。
(2) 问题就是docker内安装了太多的东西,需要清除以下的内容:
- yum安装时候的缓存和程序包
在进行yum安装完后,添加了如下命令进行软件包和缓存的清除
yum clean packages && yum clean headers && yum clean all
- pip安装时候的缓存和程序包
在进行pip安装的时候,加上参数--no-cache-dir进行无缓存安装,如:
pip3 --no-cache-dir install pillow
- 减少不必要的依赖包
- 减少不必要的依赖包,这个难度是比较大的,网上的一些教程中的依赖包并不知道是不是真的是需要的,就都一股脑的安装上去了,最好的办法还是,仅仅只适用yum和pip安装,不自行下载安装。
- 对于tar包等一些压缩包,使用ADD命令COPY,ADD命令是会自动解压这部分的压缩包,而不会把压缩包的内容一块带到镜像上面去。如果使用COPY则还需要手动的删除这些压缩包。
- 构建docker镜像的时候,上下文目录不要有太多东西,只保留必要的东西在里面
- 改用flask为更加轻量级的bottle
亲测,flask改为bottle省不了多少空间。
3. 一些错误的Dockerfile构建过程,产生了太多Exited状态的废弃container
对于这些container不必手下留情,直接全部删除:
docker rm $(docker ps -q -f status=exited);
当然如果有一些其他的docker是可用的,可能会误删,请慎用!
4. 使用docker save的时候,不要使用image id,而是使用 [REPOSITORY]:[TAG]
不要使用image id,而是使用 [REPOSITORY]:[TAG],原因是因为如果用的image id进行构建的话,并不会保留[REPOSITORY]:[TAG],导致重新load这个镜像的时候,REPOSITORY与TAG为None
[root@localhost ai_build]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ai_module v1 dc8dab4a9aa0 7 seconds ago 923MB
nginx latest f6d0b4767a6c 8 weeks ago 133MB
centos latest 300e315adb2f 3 months ago 209MB
centos 7 8652b9f0cb4c 3 months ago 204MB
[root@localhost ai_build]#
[root@localhost ai_build]#
[root@localhost ai_build]#
[root@localhost ai_build]# docker save -o ai_module.tar ai_module:v1
5. Dockerfile语法校验
可以在以下网站中进行dockerfile的语法校验,还会给你提一些意见: