【问题标题】:Docker image Size increases if I remove few lines of code如果我删除几行代码,Docker 图像大小会增加
【发布时间】:2018-04-17 02:31:12
【问题描述】:

我正在尝试减小 docker 映像大小,但 Dockerfile 很奇怪。

我连接RUN 命令以减小图像的大小。当我构建下面的 Dockerfile 时,它​​只创建了 235MB。

FROM nginx:alpine

RUN apk add --no-cache --virtual .build-deps \
        gcc \
        libc-dev \
        make \
        openssl \
        pcre-dev \
        zlib-dev \
        linux-headers \
        curl \
        gnupg \
        libxslt-dev \
        gd-dev \
        perl-dev \
    && apk add --no-cache --virtual .libmodsecurity-deps \
        pcre-dev \
        libxml2-dev \
        git \
        libtool \
        automake \
        autoconf \
        g++ \
        flex \
        bison \
        yajl-dev \
        git \
    # Add runtime dependencies that should not be removed
    && apk add --no-cache \
        doxygen \
        geoip \
        geoip-dev \
        yajl \
        libstdc++ \
        sed \
    # Installing ModSec Library version 3
    && echo "Installing ModSec Library" \
    && git clone -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /opt/ModSecurity \
    && cd /opt/ModSecurity \
    && git submodule init \
    && git submodule update \
    && ./build.sh \
    && ./configure && make && make install \
    && echo "Finished Installing ModSec Library" \
    # Installing ModSec - Nginx connector
    && cd /opt \
    && echo 'Installing ModSec - Nginx connector' \
    && git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git \
    && wget http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz \
    && tar zxvf nginx-$NGINX_VERSION.tar.gz \
    # Adding Nginx Connector Module
    && cd /opt/nginx-$NGINX_VERSION \ 
    && ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx \
    && make modules \
    && cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules \
    && echo "Finished Installing ModSec - Nginx connector" \
    # Begin installing ModSec OWASP Rules
    && echo "Begin installing ModSec OWASP Rules" \
    && mkdir /etc/nginx/modsec \
    && wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended \
    && mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf \
    && sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf \
    # Fetching owasp-modsecurity-crs
    && cd /opt \
    && git clone -b v3.0/master https://github.com/SpiderLabs/owasp-modsecurity-crs \
    && mv owasp-modsecurity-crs/ /usr/local/ \
    && cp /usr/local/owasp-modsecurity-crs/crs-setup.conf.example /usr/local/owasp-modsecurity-crs/crs-setup.conf \
    # Creating modsec file
    && echo 'Creating modsec file' \
    && echo -e '# From https://github.com/SpiderLabs/ModSecurity/blob/master/\n \
      # modsecurity.conf-recommended\n \
      # Edit to set SecRuleEngine On\n \
      Include "/etc/nginx/modsec/modsecurity.conf"\n \
      # OWASP CRS v3 rules\n \
      Include "/usr/local/owasp-modsecurity-crs/crs-setup.conf"\n \
      Include "/usr/local/owasp-modsecurity-crs/rules/*.conf"'\
      >>/etc/nginx/modsec/main.conf \
    && chown nginx:nginx /etc/nginx/modsec/main.conf \
    # Removing old Nginx conf files
    && rm -fr /etc/nginx/conf.d/ \
    && rm -fr /etc/nginx/nginx.conf \
    && chown -R nginx:nginx /usr/share/nginx \
    # delete uneeded and clean up
    && apk del .build-deps \
    && apk del .libmodsecurity-deps \
    && rm -fr ModSecurity \
    && rm -fr ModSecurity-nginx \
    && rm -fr nginx-$NGINX_VERSION.tar.gz \
    && rm -fr nginx-$NGINX_VERSION

COPY conf/nginx.conf /etc/nginx
COPY conf/conf.d /etc/nginx/conf.d
COPY errors /usr/share/nginx/errors

WORKDIR /usr/share/nginx/html

CMD nginx -g 'daemon off;'

EXPOSE 80

我看过 docker history imagedId,它显示这个 RUN 命令的大小增加了大约 855MB。有人明白为什么它的行为很奇怪吗?

任何想法都会很有帮助,每次都很难调试构建映像。

【问题讨论】:

  • 你有没有在容器内运行 du / 来检查正在使用的空间是什么?如果它仍然存在。
  • 除此之外,多阶段构建 (docs.docker.com/develop/develop-images/multistage-build) 将允许您解耦构建和运行时依赖项。结果将是更清晰的图像,您可能会更容易发现导致空间使用泄漏的原因。
  • @GonzaloMatheu 我确实听说过多阶段构建,但在我的情况下,这是重新编译 nginx,我需要依赖关系以及图像。我认为这是我可以实施的最佳方式。

标签: docker docker-compose dockerfile docker-machine


【解决方案1】:

我尝试了两种方式进行构建,发现差别不大。
/opt/ModSecurity 消耗了大部分磁盘空间
git clone 后最初是 74MB。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
oldimage            latest              924a8d4f941e        11 minutes ago      867MB
newimage            latest              d1ca029927c2        About an hour ago   867MB
nginx               alpine              ebe2c7c61055        6 days ago          18MB

然而,在构建完整版本后 - 它已增长到 ~650MB。

$ du -sh *
639.7M  ModSecurity
408.0K  ModSecurity-nginx
7.5M    nginx-1.13.12
996.0K  nginx-1.13.12.tar.gz    

【讨论】:

  • 现在可以试试第一张图片吗?我忘了添加几行,现在更新了第一个 dockerfile
  • 根据当前 docker 文件,您有删除 && rm -fr ModSecurity \ 的指令,这是消耗的目录:639.7 MB。该目录还包含源代码和构建输出二进制文件。
  • 哇@fly2matrix 你让我意识到它应该是rm -rf /opt/ModSecurity 而不仅仅是rm -rf Modsecurity 。谢啦。愚蠢的错误导致了两天的调试。
猜你喜欢
  • 2019-03-11
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2015-07-17
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
相关资源
最近更新 更多