https://blog.zhenglin.work/docker/dockerfile-rule.html

    控制镜像大小
    优先选取基于alpine的镜像 查看tomcat镜像:https://hub.docker.com/_/tomcat?tab=tags (docker hup 中搜索tomcat镜像) 如tomcat8.5的镜像
    8.5-jre11 204 MB
    Last update: 13 days ago
    而基于alpine的tomcat镜像
    8.5-jre8-alpine 72 MB
    Last update: 10 days ago
    一眼就能看出来基于alpine的镜像比默认镜像少了130多M 但alpine镜像里面缺少了很多东西,设置不支持bash命令,我们可以在制作镜像时,一一给安装上,安装完成后删除缓存文件,就是安装文件;
    选取国内的镜像源
    如清华大学、阿里云等

    Dockerfile示例:

    1. FROM alpine:3.7
    2. MAINTAINER chenzhenglin
    3. #更新Alpine的软件源为国内(清华大学)的站点,因为从默认官源拉取实在太慢了。。。
    4. RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.7/main/" > /etc/apk/repositories
    5. #注意alpine的版本号 可能有差异,链接地址源最好用浏览器打开查看验证一下; 或用latest代替
    6. RUN apk update
    7. && apk upgrade
    8. && apk add --no-cache bash
    9. bash-doc
    10. bash-completion
    11. && apk add net-tools vim
    12. && rm -rf /var/cache/apk/*
    13. ……


    apk add —no-cache不使用本地缓存安装包数据库,直接从远程获取安装包信息安装。这样我们就不必通过apk update获取安装包数据库了,&&合并命令 好处是,多条命令合并成一条命令,减少docker images的层

    如果基于centos或Ubuntu的系统 最好也要把软件源换成国内的

    1. FROM centos:7.6.1810
    2. RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.bak &&
    3. curl -s http://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/CentOS-Base.repo &&
    4. curl -s http://mirrors.aliyun.com/repo/epel-7.repo -o /etc/yum.repos.d/epel-7.repo &&
    5. yum repolist &&


    注意:Alpine 镜像中的 telnet 在 3.7 版本后被转移至 busybox-extras 包中,所以apk add telnet 会报错
    如下,一个基于tomcat:8.5-alpine镜像的Dockerfile,并验证通过

    1. FROM tomcat:8.5-alpine
    2. MAINTAINER chenzhenglin
    3. #更新Alpine的软件源为国内(清华大学)的站点,因为从默认官源拉取实在太慢了…… alpine版本要从dockerfile里面查找到
    4. RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/latest-stable/main/" > /etc/apk/repositories
    5. #注意alpine的版本号 可能有差异
    6. RUN apk update
    7. && apk upgrade
    8. && apk add --update --no-cache net-tools vim busybox-extras curl
    9. && rm -rf /var/cache/apk/*


    查看镜像的Dockerfile
    在docker hub 里面找到所需镜像后,在description的tab页,选择需要的版本,点击,一般会自动跳转到其githup源码界面; 如:https://hub.docker.com/_/tomcat?tab=description 如下Dockerfile文件

    1. FROM openjdk:8-jre
    2. ENV CATALINA_HOME /usr/local/tomcat
    3. ENV PATH $CATALINA_HOME/bin:$PATH
    4. RUN mkdir -p "$CATALINA_HOME"
    5. WORKDIR $CATALINA_HOME
    6. ……此处也省略不必要代码
    7. RUN apt-get update && apt-get install -y --no-install-recommends \
    8. libapr1 \
    9. ……此处也省略不必要代码
    10. apt-get install -y --no-install-recommends wget ca-certificates; \
    11. ……此处也省略不必要代码
    12. # sh removes env vars it doesn't support (ones with periods)
    13. # https://github.com/docker-library/tomcat/issues/77
    14. find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \
    15. \
    16. ……此处也省略不必要代码
    17. CMD ["catalina.sh", "run"]


    从这个Dockerfile文件可以看出,已经安装了wget等工具,并把默认的sh换成了bash;

    如何判断tomcat里面采用哪一版本的alpine呢,激活镜像后,查看其系统版本信息 cat /etc/os-release 同样其他linux也可以采用此方法查看版本号: cat /etc/redhat|centos-release

    alpine系统添加软件的常用方法,参见链接: https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management

    其他精简镜像的方法
    https://mp.weixin.qq.com/s/LOXNMYtZbnYeDR2lBI56fw