求教这个 DockerFile 如何优化下镜像大小 - V2EX
kestrelBright

求教这个 DockerFile 如何优化下镜像大小

  •  
  •   kestrelBright Jun 9, 2021 3345 views
    This topic created in 1798 days ago, the information mentioned may be changed or developed.
    FROM daocloud.io/library/ubuntu:18.04 ENV HOME /home ENV DEBIAN_FRONTEND noninteractive ENV INITRD No RUN set -eux; \ apt-get update; \ apt-get install -y locales; \ locale-gen en_US.utf8; \ rm -rf /var/lib/apt/lists/* ENV LANG en_US.utf8 ENV LANGUAGE en_US.utf8 RUN set -eux; \ apt-get update; \ apt-get install -y apt-file; \ apt-file update; \ apt-get install -y software-properties-common; \ apt-get install -yq --no-install-recommends vim libboost-all-dev gcc-4.8; \ add-apt-repository -y ppa:ondrej/php; \ apt-get update -y; \ apt-get install -y curl wget openssl php7.2 php7.2-bcmath php7.2-cli php7.2-cgi php7.2-common php7.2-dev php7.2-apcu php7.2-geoip php7.2-fpm php7.2-json php7.2-memcached php7.2-memcache php7.2-mysql php7.2-pgsql php7.2-mongo php7.2-sqlite php7.2-sybase php7.2-interbase php7.2-odbc php7.2-ldap php7.2-gmp php7.2-intl php7.2-imagick php7.2-gd php7.2-imap php7.2-curl php7.2-oauth php7.2-redis php7.2-enchant php7.2-xml php7.2-xmlrpc php7.2-tidy php7.2-recode php7.2-readline php7.2-zip php7.2-pspell php7.2-mbstring php7.2-swoole; \ rm -rf /var/lib/apt/lists/* # Tidy up RUN set -eux; \ apt-get -y autoremove; \ apt-get clean; \ apt-get autoclean; \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN mkdir -p /usr/share/nginx/html && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # Allow mounting files VOLUME ["/usr/share/nginx/html"] # Set the work directory WORKDIR /usr/share/nginx/html CMD ["php-fpm7.2", "-F"] EXPOSE 9000 
    26 replies    2021-06-10 13:51:57 +08:00
    Rwing
        1
    Rwing  
       Jun 9, 2021
    用一个现成的 php 基础镜像.....
    everyx
        2
    everyx  
       Jun 9, 2021 via Android
    ENV 都移到前面,然后合并所有的 RUN 命令
    Alraemon
        3
    Alraemon  
       Jun 9, 2021 via iPhone
    为啥是 Ubuntu…
    basefas
        4
    basefas  
       Jun 9, 2021
    用 alpine 做基础镜像,合并 RUN,看看打完包每层的大小,再优化
    orcusfox
        5
    orcusfox  
       Jun 9, 2021 via iPhone
    直接在 https://hub.docker.com/_/php 挑自己要的,又是 install 又是 make 会产生很多用不上的文件
    swulling
        7
    swulling  
       Jun 9, 2021 via iPhone
    先加后删的方式没办法降低空间。要把 apt install 和 clean 写一行
    BeautifulSoap
        8
    BeautifulSoap  
       Jun 9, 2021
    lz 你装 php 干嘛手动装? php 官方就有基于 alpine 的镜像,体积只有 20 多 mb,nginx 也通过 alpine 的包管理来添加
    Vhc001
        9
    Vhc001  
       Jun 9, 2021
    docker pull php:fpm-alpine
    dolphintwo
        10
    dolphintwo  
       Jun 9, 2021
    alpine 正解
    kestrelBright
        11
    kestrelBright  
    OP
       Jun 9, 2021
    @BeautifulSoap 学习下呗
    kestrelBright
        12
    kestrelBright  
    OP
       Jun 9, 2021
    @everyx 只少了 1mb
    kestrelBright
        13
    kestrelBright  
    OP
       Jun 9, 2021
    @luvmhx 比较好找以前旧的包吧
    kestrelBright
        14
    kestrelBright  
    OP
       Jun 9, 2021
    @swulling 试过,没区别,还是一样大
    ```
    RUN set -eux; \
    apt-get update; \
    apt-get install -y locales && apt-get clean; \
    locale-gen en_US.utf8; \
    apt-get update; \
    apt-get install -y apt-file && apt-get clean; \
    apt-file update; \
    apt-get install -y software-properties-common && apt-get clean; \
    apt-get install -yq --no-install-recommends vim libboost-all-dev gcc-4.8 && apt-get clean; \
    add-apt-repository -y ppa:ondrej/php; \
    apt-get update -y; \
    apt-get install -y curl wget openssl php7.2 php7.2-bcmath php7.2-cli php7.2-cgi php7.2-common php7.2-dev php7.2-apcu php7.2-geoip php7.2-fpm php7.2-json php7.2-memcached php7.2-memcache php7.2-mysql php7.2-pgsql php7.2-mongo php7.2-sqlite php7.2-sybase php7.2-interbase php7.2-odbc php7.2-ldap php7.2-gmp php7.2-intl php7.2-imagick php7.2-gd php7.2-imap php7.2-curl php7.2-oauth php7.2-redis php7.2-enchant php7.2-xml php7.2-xmlrpc php7.2-tidy php7.2-recode php7.2-readline php7.2-zip php7.2-pspell php7.2-mbstring php7.2-swoole && apt-get clean; \
    ```
    BeautifulSoap
        15
    BeautifulSoap  
       Jun 9, 2021
    @kestrelBright
    如果你只是想用的话,直接 FROM php:7.2-alpine 就行了,没必要去关心怎么做到的

    你如果是想知道该用什么办法把 php 的镜像体积减下来的话,可以去看 php 官方的 alpine 镜像的 Dockerfile 是怎么构建的就行了。php 官方的 alpine 镜像大小只有 20 多 MB 大小,只不过构建过程很复杂,不一定能学得来。。。。。

    https://github.com/docker-library/php/tree/master/7.3/alpine3.13/fpm
    kestrelBright
        16
    kestrelBright  
    OP
       Jun 9, 2021
    @mohuishou 不大明白怎么拷贝前一阶段的,是这样吗?
    ```
    FROM daocloud.io/library/ubuntu:18.04 as php72

    ENV HOME /home
    ENV DEBIAN_FRONTEND noninteractive
    ENV INITRD No
    ENV LANG en_US.utf8
    ENV LANGUAGE en_US.utf8

    RUN set -eux; \
    apt-get update; \
    apt-get install -y locales; \
    locale-gen en_US.utf8; \
    apt-get update; \
    apt-get install -y apt-file; \
    apt-file update; \
    apt-get install -y software-properties-common; \
    apt-get install -yq --no-install-recommends vim libboost-all-dev gcc-4.8; \
    add-apt-repository -y ppa:ondrej/php; \
    apt-get update -y; \
    apt-get install -y curl wget openssl php7.2 php7.2-bcmath php7.2-cli php7.2-cgi php7.2-common php7.2-dev php7.2-apcu php7.2-geoip php7.2-fpm php7.2-json php7.2-memcached php7.2-memcache php7.2-mysql php7.2-pgsql php7.2-mongo php7.2-sqlite php7.2-sybase php7.2-interbase php7.2-odbc php7.2-ldap php7.2-gmp php7.2-intl php7.2-imagick php7.2-gd php7.2-imap php7.2-curl php7.2-oauth php7.2-redis php7.2-enchant php7.2-xml php7.2-xmlrpc php7.2-tidy php7.2-recode php7.2-readline php7.2-zip php7.2-pspell php7.2-mbstring php7.2-swoole; \
    apt-get -y autoremove; \
    apt-get clean; \
    apt-get autoclean; \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*; \
    mkdir -p /usr/share/nginx/html && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    FROM daocloud.io/library/ubuntu:18.04
    COPY --from=php72 /usr /usr

    VOLUME ["/usr/share/nginx/html"]
    WORKDIR /usr/share/nginx/html
    CMD ["php-fpm7.2", "-F"]
    EXPOSE 9000
    ```
    kestrelBright
        17
    kestrelBright  
    OP
       Jun 9, 2021
    @BeautifulSoap 就是学下怎么减小体积
    mohuishou
        18
    mohuishou  
       Jun 9, 2021
    @kestrelBright 类似 PHP 的脚本语言,一般不需要做多阶段,选个小基础镜像就可以有效减少大小了
    kestrelBright
        19
    kestrelBright  
    OP
       Jun 9, 2021
    @swulling no-install-recommends 有效,少了 100mb
    THESDZ
        20
    THESDZ  
       Jun 9, 2021
    build 阶段可以单独放一个 docker 镜像,然后从这个临时镜像复制
    php 我不懂,找个 nodejs 的你看看


    FROM greencloudcomputing/nodejs14 AS builder
    WORKDIR /build
    COPY ./ .
    RUN cd /build && npm --registry https://registry.npm.taobao.org install && npm run build

    FROM nginx:stable-alpine
    RUN apk add --repository https://mirrors.aliyun.com/alpine/v3.4/main/ --update curl && rm -rf /var/cache/apk/*
    COPY nginx.conf /etc/nginx/nginx.conf
    COPY --from=builder /build/dist /usr/share/nginx/html/
    maxbon
        21
    maxbon  
       Jun 9, 2021
    ENV 放一起,RUN 放一起,理论上 RUN 只能有一条,多了就大很多,另外有 apt-get 操作的话,最后一步清缓存,RUN 的最后一步永远是删临时文件和清缓存
    everyx
        22
    everyx  
       Jun 9, 2021 via Android
    @kestrelBright 那就只能修改 base image 了
    kestrelBright
        23
    kestrelBright  
    OP
       Jun 9, 2021
    @everyx base image 很小也,只有 63.3mb ,我最开始的 DockerFile 弄出来镜像 1.5g ,现在 899mb
    kestrelBright
        24
    kestrelBright  
    OP
       Jun 10, 2021
    @mohuishou 基础镜像只有 63mb 也,能请教下这个怎么在 build 阶段从临时镜像复制不?是不是就是把安装好 php 和那些扩展复制到基础镜像?
    kestrelBright
        25
    kestrelBright  
    OP
       Jun 10, 2021
    @maxbon 嗯嗯,这样可以减小大概 1/3
    maxbon
        26
    maxbon  
       Jun 10, 2021
    @kestrelBright 你拿 ubuntu 做基础镜像就离谱,不过既然一定要用,可以卸载掉一些没用的服务
    About     Help     Advertise     Blog     API     FAQ     Solana     5792 Online   Highest6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 89ms UTC 02:45 PVG 10:45 LAX 19:45 JFK 22:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86