使用apt-get build deps最小化Docker镜像

时间:2015-03-10 15:23:39

标签: build docker apt-get

有时在构建Docker镜像时,使用apt-get是必要的。例如,运行Magento的图像可能会像这样开始

FROM php:5.4-apache
RUN apt-get -qqy update \
 && apt-get -qqy install git \
                         libmcrypt-dev \
                         libpng12-dev \
                         libxml2-dev \
                         libxslt-dev \
 && docker-php-ext-install bcmath \
                           gd \
                           mcrypt \
                           mysql \
                           soap \
                           xsl \
                           zip

但是现在我有了apt-get命令带来的所有垃圾。更糟糕的是,我甚至不确定我能够删除的内容,因为可能是php libs是动态链接的。

我按照

这样的思路思考
  1. 有没有办法静态链接docker-php-ext-install中的php库,所以我可以核实所有apt-get的内容?
  2. 如何删除apt-get update留下的数据?
  3. 但这些只是X-Y questions。我的实际问题只是

    如何在不完全消除在Dockerfile中使用apt-get的易用性和可维护性的情况下构建较小的Docker镜像?

2 个答案:

答案 0 :(得分:3)

你可以通过运行rm -rf /var/lib/apt/lists/*例如

来摆脱一些东西
RUN apt-get update \
    && apt-get install -y MY_PACKAGE \
    && rm -rf /var/lib/apt/lists/*

请记住,您需要在与apt-get update相同的行中运行此功能才能使其生效。

答案 1 :(得分:0)

您在哪里寻找这种方法? https://www.ianlewis.org/en/creating-smaller-docker-images

ENV REDIS_VERSION 3.0.5
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.0.5.tar.gz
ENV REDIS_DOWNLOAD_SHA1 ad3ee178c42bfcfd310c72bbddffbbe35db9b4a6

# for redis-sentinel see: http://redis.io/topics/sentinel
RUN buildDeps='gcc libc6-dev make' \
    && set -x \
    && apt-get update && apt-get install -y $buildDeps --no-install-recommends \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir -p /usr/src/redis \
    && curl -sSL "$REDIS_DOWNLOAD_URL" -o redis.tar.gz \
    && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && rm redis.tar.gz \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -r /usr/src/redis \
    && apt-get purge -y --auto-remove $buildDeps

具体地说,您在同一层中卸载了不需要的软件包