优化 dockerfile 图像大小。还有什么以及如何减小此图像的大小?

Optimizing dockerfile image size. What more & how can i reduce size of this image?

这是我的第一个问题所以 你好世界

所以我是初学者,不幸的是在 GNU/Linux 和 dockerizing 方面。 我得到一个图像,存在的理由是将 bitbucket-pipelines 和 azure-pipelines 的所有图像都放在一个图像中。 (多项目图像)。

在强制更新期间(添加 groovy 并由于 ssl 问题更改了 nodejs 源)图像大小从 1GB 增加到 1.5GB。

通过我的调整,我设法将 150MB 释放到当前的 1.35GB

我的两周

当前DOCKER文件

FROM ubuntu:18.04
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
WORKDIR ~/
USER root
ARG USERNAME=root
RUN apt-get update && \
    apt-get -y --no-install-recommends install locales \
        build-essential \
        git \
        maven \
        ant \
        unzip \
        python3 \
        zip \
        wget \
        apt-transport-https \ 
        ca-certificates \
        curl \
        software-properties-common \
    && echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen \
    && locale-gen en_US.UTF-8 \
    && apt-get autoremove -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENV JAVA_VERSION jdk-12.0.2+10
RUN set -eux; \
    ARCH="$(dpkg --print-architecture)"; \
    case "${ARCH}" in \
       aarch64|arm64) \
         ESUM='855f046afc5a5230ad6da45a5c811194267acd1748f16b648bfe5710703fe8c6'; \
         BINARY_URL='https://github.com/AdoptOpenJDK/openjdk12-binaries/releases/download/jdk-12.0.2%2B10/OpenJDK12U-jdk_aarch64_linux_hotspot_12.0.2_10.tar.gz'; \
         ;; \
       armhf) \
         ESUM='9fec85826ffb7b2b2cf2853a6ed3e001b528ed5cf13e435cd13026398b5178d8'; \
         BINARY_URL='https://github.com/AdoptOpenJDK/openjdk12-binaries/releases/download/jdk-12.0.2%2B10/OpenJDK12U-jdk_arm_linux_hotspot_12.0.2_10.tar.gz'; \
         ;; \
       ppc64el|ppc64le) \
         ESUM='4b0c9f5cdea1b26d7f079fa6478aceebf1923c947c4209d5709c0869dd71b98f'; \
         BINARY_URL='https://github.com/AdoptOpenJDK/openjdk12-binaries/releases/download/jdk-12.0.2%2B10/OpenJDK12U-jdk_ppc64le_linux_hotspot_12.0.2_10.tar.gz'; \
         ;; \
       s390x) \
         ESUM='9897deeaf7a2c90374fbaca8b3eb8e63267d8fc1863b43b21c0bfc86e4783470'; \
         BINARY_URL='https://github.com/AdoptOpenJDK/openjdk12-binaries/releases/download/jdk-12.0.2%2B10/OpenJDK12U-jdk_s390x_linux_hotspot_12.0.2_10.tar.gz'; \
         ;; \
       amd64|x86_64) \
         ESUM='1202f536984c28d68681d51207a84b6c76e5998579132d3fe1b8085aa6a5f21e'; \
         BINARY_URL='https://github.com/AdoptOpenJDK/openjdk12-binaries/releases/download/jdk-12.0.2%2B10/OpenJDK12U-jdk_x64_linux_hotspot_12.0.2_10.tar.gz'; \
         ;; \
       *) \
         echo "Unsupported arch: ${ARCH}"; \
         exit 1; \
         ;; \
    esac; \
    curl -LfsSo /tmp/openjdk.tar.gz ${BINARY_URL}; \
    echo "${ESUM} */tmp/openjdk.tar.gz" | sha256sum -c -; \
    mkdir -p /opt/java/openjdk; \
    cd /opt/java/openjdk; \
    tar -xf /tmp/openjdk.tar.gz --strip-components=1; \
    rm -rf /tmp/openjdk.tar.gz;
        
ENV JAVA_HOME="/opt/java/openjdk" \
    PATH="/opt/java/openjdk/bin:$PATH" \
    ANT_HOME="/usr/share/java/apache-ant" \
    PATH="$PATH:$ANT_HOME/bin" \
    GROOVY_HOME="/$USERNAME/.sdkman/candidates/groovy/3.0.8" \
    PATH="$PATH:/$USERNAME/.sdkman/candidates/groovy/3.0.8/bin"

RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
    && apt-get install -f \
    && apt-get install -y nodejs \
    && apt-get autoremove -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && curl -s "https://get.sdkman.io"  | bash \
    && yes | /bin/bash -l -c "source $HOME/.sdkman/bin/sdkman-init.sh \
    && sdk install groovy \
    && rm -rf $HOME/.sdkman/archives/* \
    && rm -rf $HOME/.sdkman/tmp/*" \
    && npm install -g npm \
    && npm install -g lodash \
    && npm install -g sfdc-generate-package \
    && npm install -g jsforce \
    && npm cache clean --force

#TESTS
CMD echo "print env varaibles: "  && printenv \
    && echo "XXX PATHS: "  && echo "$PATH  \n" \
    && echo "GROOVY_HOME " && echo "$GROOVY_HOME " \
    && echo "HOME " && echo "$HOME " \
    && echo "XXX SOFTWARE VERSIONS:" \
    && echo "nodejs :" && nodejs -v \
    && echo "npm :" && npm -v \
    && git --version \
    && ant -version \
    && python3 --version \
    && java -version \
    && groovy -version

DOCKER历史

IMAGE               CREATED BY                                      SIZE
d7f3822f32da        /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
7f2f0f621ae8        |1 USERNAME=root /bin/sh -c curl -fsSL https…   413MB
a03ee701466f        /bin/sh -c #(nop)  ENV JAVA_HOME=/opt/java/o…   0B
8f3a9e1ce43c        |1 USERNAME=root /bin/sh -c set -eux;     AR…   350MB
ae7b362dfaee        /bin/sh -c #(nop)  ENV JAVA_VERSION=jdk-12.0…   0B
72fc4ae7e73f        |1 USERNAME=root /bin/sh -c apt-get update &…   521MB```

有几种方法可以使您的 Docker 图片变小。 看着你的例子,我想到了 2 件事:

  1. 尝试在多个阶段创建图像。获取在一个阶段中创建图像所需的工具,并通过仅从前一个阶段复制文件来创建容器的最新版本。 参见 Docker documentation on MultiStage Containers

  2. 您正在拍摄一张 Ubuntu 图像,该图像非常大。最好在最后阶段选择高山

  3. 在那个 Ubuntu 容器中,您正在设置整个应用程序(Python、Maven、Java)。 这不是 Docker 的哲学。最好为每个服务创建一个图像。 Python-container、Java-container 等。使用此设置尽量坚持使用标准图像。 当您需要在容器中执行 apt-get 时,您需要考虑哪里出错了以及如何将其拆分到不同的容器中。

  4. 对于相互通信的不同容器,使用docker-compose。