如何减小Docker镜像的大小

7 docker dockerfile docker-compose

我有Node.js应用程序,我作为docker容器运行.这是该应用程序的Dockerfile.

FROM ubuntu

ARG ENVIRONMENT
ARG PORT

RUN apt-get update -qq
RUN apt-get install -y build-essential nodejs npm nodejs-legacy vim

RUN mkdir /consumer_portal
ADD . /consumer_portal
WORKDIR /consumer_portal

RUN npm install -g express
RUN npm install -g path
RUN npm cache clean
RUN npm install

EXPOSE $PORT

ENTRYPOINT [ "node",  "server.js" ]
CMD [ $PORT, $ENVIRONMENT ]
Run Code Online (Sandbox Code Playgroud)

我可以修改此Dockerfile中的某些内容以减少docker镜像大小

Ant*_*ond 6

尝试将所有RUN指令打包在一起,这会减少中间图像的数量。(但它不会减少最终图像的尺寸)。

添加rm -rf /var/lib/apt/lists/*后将apt-get update通过删除所有无用的 apt-get 内容来减小图像大小。

您还可以vim从最后一个 RUN 指令中的映像中删除。

FROM ubuntu

ARG ENVIRONMENT
ARG PORT

RUN apt-get update \
    && apt-get install -y build-essential nodejs npm nodejs-legacy vim \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir /consumer_portal

ADD . /consumer_portal
WORKDIR /consumer_portal

RUN npm install -g express \
    && npm install -g path \
    && npm cache clean \
    && npm install

EXPOSE $PORT

ENTRYPOINT [ "node",  "server.js" ]
CMD [ $PORT, $ENVIRONMENT ]
Run Code Online (Sandbox Code Playgroud)


n2o*_*n2o 6

正如大多数人所建议的那样,使用官方节点高山图像作为基本图像是减少图像整体尺寸的简单解决方案,因为即使基本高山图像与基础ubuntu图像相比也要小得多.

Dockerfile看起来像这样:

FROM node:alpine

ARG ENVIRONMENT
ARG PORT

RUN mkdir /consumer_portal \
    && npm install -g express path

COPY . /consumer_portal
WORKDIR /consumer_portal

RUN npm cache clean \
    && npm install

EXPOSE $PORT

CMD [ "node",  "server.js" ]
Run Code Online (Sandbox Code Playgroud)

它几乎相同,应该按预期工作.来自ubuntu图像的大多数命令可以在高山图像中以相同的方式应用.

当我添加模拟数据以创建一个类似的项目时,会产生一个大小为491 MB的ubuntu图像,而alpine版本只有62.5 MB大:

REPOSITORY   TAG       IMAGE ID        CREATED          SIZE
alpinefoo    latest    8ca6f338475e    5 minutes ago    62.5MB
ubuntufoo    latest    38620a1bd5a6    6 minutes ago    491MB
Run Code Online (Sandbox Code Playgroud)

  • 仅当对图像大小的主要贡献是基础层时,这才是正确的(例如,数据科学家发现通常情况并非如此) (2认同)

bar*_*rat 0

如果您基于 Ubuntu,那么明智的做法是这样做

RUN apt-get update && apt-get install -y \
    build-essential \
    cwhatever-you-want \
    vim \
 && rm -rf /var/lib/apt/lists/*
Run Code Online (Sandbox Code Playgroud)

最后一行会清除很多:)您应该始终在同一行中进行 apt-get update ,因为否则如果您添加另一个要安装的库,它将被缓存并且不会在下一个版本中触发。