dockerfile优化_dockerfile 优化 - CSDN
精华内容
参与话题
  • Dockerfile优化技巧

    2020-01-25 01:15:58
    我已经使用 Docker 有一段时间了,其中编写 Dockerfile 是非常重要的一部分工作。在这篇博客中,我打算分享一些建议,帮助大家编写更好的 Dockerfile。 目标: 更快的构建速度 更小的 Docker 镜像大小 更少的 ...

    我已经使用 Docker 有一段时间了,其中编写 Dockerfile 是非常重要的一部分工作。在这篇博客中,我打算分享一些建议,帮助大家编写更好的 Dockerfile。

    目标:

    • 更快的构建速度
    • 更小的 Docker 镜像大小
    • 更少的 Docker 镜像层
    • 充分利用镜像缓存
    • 增加 Dockerfile 可读性
    • 让 Docker 容器使用起来更简单

    总结

    • 编写.dockerignore 文件
    • 容器只运行单个应用
    • 将多个 RUN 指令合并为一个
    • 基础镜像的标签不要用 latest
    • 每个 RUN 指令后删除多余文件
    • 选择合适的基础镜像(alpine 版本最好)
    • 设置 WORKDIR 和 CMD
    • 使用 ENTRYPOINT (可选)
    • 在 entrypoint 脚本中使用 exec
    • COPY 与 ADD 优先使用前者
    • 合理调整 COPY 与 RUN 的顺序
    • 设置默认的环境变量,映射端口和数据卷
    • 使用 LABEL 设置镜像元数据
    • 添加 HEALTHCHECK

    示例

    示例 Dockerfile 犯了几乎所有的错(当然我是故意的)。接下来,我会一步步优化它。假设我们需要使用 Docker 运行一个 Node.js 应用,下面就是它的 Dockerfile(CMD 指令太复杂了,所以我简化了,它是错误的,仅供参考)。

    FROM ubuntu
    
    ADD . /app
    
    RUN apt-get update
    RUN apt-get upgrade -y
    RUN apt-get install -y nodejs ssh mysql
    RUN cd /app && npm install
    
    # this should start three processes, mysql and ssh
    # in the background and node app in foreground
    # isn't it beautifully terrible? <3
    CMD mysql & sshd & npm start
    

    构建镜像:

    docker build -t wtf .
    

    1. 编写.dockerignore 文件

    构建镜像时,Docker 需要先准备context ,将所有需要的文件收集到进程中。默认的context包含 Dockerfile 目录中的所有文件,但是实际上,我们并不需要.git 目录,node_modules 目录等内容。 .dockerignore 的作用和语法类似于 .gitignore,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少 Docker 镜像的大小。示例如下:

    .git/
    node_modules/
    

    2. 容器只运行单个应用

    从技术角度讲,你可以在 Docker 容器中运行多个进程。你可以将数据库,前端,后端,ssh,supervisor 都运行在同一个 Docker 容器中。但是,这会让你非常痛苦:

    • 非常长的构建时间(修改前端之后,整个后端也需要重新构建)
    • 非常大的镜像大小
    • 多个应用的日志难以处理(不能直接使用 stdout,否则多个应用的日志会混合到一起)
    • 横向扩展时非常浪费资源(不同的应用需要运行的容器数并不相同)
    • 僵尸进程问题 - 你需要选择合适的 init 进程

    因此,我建议大家为每个应用构建单独的 Docker 镜像,然后使用 Docker Compose 运行多个 Docker 容器。

    现在,我从 Dockerfile 中删除一些不需要的安装包,另外,SSH 可以用docker exec替代。示例如下:

    FROM ubuntu
    
    ADD . /app
    
    RUN apt-get update
    RUN apt-get upgrade -y
    
    # we should remove ssh and mysql, and use
    # separate container for database
    RUN apt-get install -y nodejs  # ssh mysql
    RUN cd /app && npm install
    
    CMD npm start
    

    3. 将多个 RUN 指令合并为一个

    Docker 镜像是分层的,下面这些知识点非常重要:

    • Dockerfile 中的每个指令都会创建一个新的镜像层。
    • 镜像层将被缓存和复用
    • 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
    • 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
    • 镜像层是不可变的,如果我们再某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件(只是这个文件在 Docker 容器中不可见了)。

    Docker 镜像类似于洋葱。它们都有很多层。为了修改内层,则需要将外面的层都删掉。记住这一点的话,其他内容就很好理解了。

    现在,我们将所有的RUN指令合并为一个。同时把apt-get upgrade删除,因为它会使得镜像构建非常不确定(我们只需要依赖基础镜像的更新就好了)

    FROM ubuntu
    
    ADD . /app
    
    RUN apt-get update \
        && apt-get install -y nodejs \
        && cd /app \
        && npm install
    
    CMD npm start
    

    记住一点,我们只能将变化频率一样的指令合并在一起。将 node.js 安装与 npm 模块安装放在一起的话,则每次修改源代码,都需要重新安装 node.js,这显然不合适。因此,正确的写法是这样的:

    FROM ubuntu
    
    RUN apt-get update && apt-get install -y nodejs
    ADD . /app
    RUN cd /app && npm install
    
    CMD npm start
    

    4. 基础镜像的标签不要用 latest

    当镜像没有指定标签时,将默认使用latest 标签。因此, FROM ubuntu 指令等同于FROM ubuntu:latest。当时,当镜像更新时,latest 标签会指向不同的镜像,这时构建镜像有可能失败。如果你的确需要使用最新版的基础镜像,可以使用 latest 标签,否则的话,最好指定确定的镜像标签。

    示例 Dockerfile 应该使用16.04作为标签。

    FROM ubuntu:16.04  # it's that easy!
    
    RUN apt-get update && apt-get install -y nodejs
    ADD . /app
    RUN cd /app && npm install
    
    CMD npm start
    

    5. 每个 RUN 指令后删除多余文件

    假设我们更新了 apt-get 源,下载,解压并安装了一些软件包,它们都保存在/var/lib/apt/lists/目录中。但是,运行应用时 Docker 镜像中并不需要这些文件。我们最好将它们删除,因为它会使 Docker 镜像变大。

    示例 Dockerfile 中,我们可以删除/var/lib/apt/lists/目录中的文件(它们是由 apt-get update 生成的)。

    FROM ubuntu:16.04
    
    RUN apt-get update \
        && apt-get install -y nodejs \
        # added lines
        && rm -rf /var/lib/apt/lists/*
    
    ADD . /app
    RUN cd /app && npm install
    
    CMD npm start
    

    6. 选择合适的基础镜像(alpine 版本最好)

    在示例中,我们选择了ubuntu作为基础镜像。但是我们只需要运行 node 程序,有必要使用一个通用的基础镜像吗?node镜像应该是更好的选择。

    FROM node
    
    ADD . /app
    # we don't need to install node
    # anymore and use apt-get
    RUN cd /app && npm install
    
    CMD npm start
    

    更好的选择是 alpine 版本的node镜像。alpine 是一个极小化的 Linux 发行版,只有 4MB,这让它非常适合作为基础镜像。

    FROM node:7-alpine
    
    ADD . /app
    RUN cd /app && npm install
    
    CMD npm start
    

    apk是 Alpine 的包管理工具。它与apt-get有些不同,但是非常容易上手。另外,它还有一些非常有用的特性,比如no-cache和 --virtual选项,它们都可以帮助我们减少镜像的大小。

    7. 设置 WORKDIR 和 CMD

    WORKDIR指令可以设置默认目录,也就是运行RUN / CMD / ENTRYPOINT指令的地方。

    CMD指令可以设置容器创建是执行的默认命令。另外,你应该讲命令写在一个数组中,数组中每个元素为命令的每个单词(参考官方文档)。

    FROM node:7-alpine
    
    WORKDIR /app
    ADD . /app
    RUN npm install
    
    CMD ["npm", "start"]
    

    8. 使用 ENTRYPOINT (可选)

    ENTRYPOINT指令并不是必须的,因为它会增加复杂度。ENTRYPOINT是一个脚本,它会默认执行,并且将指定的命令错误其参数。它通常用于构建可执行的 Docker 镜像。entrypoint.sh 如下:

    #!/usr/bin/env sh
    # $0 is a script name,
    # $1, $2, $3 etc are passed arguments
    # $1 is our command
    CMD=$1
    
    case "$CMD" in
      "dev" )
        npm install
        export NODE_ENV=development
        exec npm run dev
        ;;
    
      "start" )
        # we can modify files here, using ENV variables passed in
        # "docker create" command. It can't be done during build process.
        echo "db: $DATABASE_ADDRESS" >> /app/config.yml
        export NODE_ENV=production
        exec npm start
        ;;
    
       * )
        # Run custom command. Thanks to this line we can still use
        # "docker run our_image /bin/bash" and it will work
        exec $CMD ${@:2}
        ;;
    esac
    

    示例 Dockerfile:

    FROM node:7-alpine
    
    WORKDIR /app
    ADD . /app
    RUN npm install
    
    ENTRYPOINT ["./entrypoint.sh"]
    CMD ["start"]
    

    可以使用如下命令运行该镜像:

    # 运行开发版本
    docker run our-app dev
    
    # 运行生产版本
    docker run our-app start
    
    # 运行bash
    docker run -it our-app /bin/bash
    

    9. 在 entrypoint 脚本中使用 exec

    在前文的 entrypoint 脚本中,我使用了exec命令运行 node 应用。不使用exec的话,我们则不能顺利地关闭容器,因为 SIGTERM 信号会被 bash 脚本进程吞没。exec命令启动的进程可以取代脚本进程,因此所有的信号都会正常工作。

    10. COPY 与 ADD 优先使用前者

    COPY指令非常简单,仅用于将文件拷贝到镜像中。ADD相对来讲复杂一些,可以用于下载远程文件以及解压压缩包(参考官方文档)。

    FROM node:7-alpine
    
    WORKDIR /app
    
    COPY . /app
    RUN npm install
    
    ENTRYPOINT ["./entrypoint.sh"]
    CMD ["start"]
    

    11. 合理调整 COPY 与 RUN 的顺序

    我们应该把变化最少的部分放在 Dockerfile 的前面,这样可以充分利用镜像缓存。

    示例中,源代码会经常变化,则每次构建镜像时都需要重新安装 NPM 模块,这显然不是我们希望看到的。因此我们可以先拷贝package.json,然后安装 NPM 模块,最后才拷贝其余的源代码。这样的话,即使源代码变化,也不需要重新安装 NPM 模块。

    FROM node:7-alpine
    
    WORKDIR /app
    
    COPY package.json /app
    RUN npm install
    COPY . /app
    
    ENTRYPOINT ["./entrypoint.sh"]
    CMD ["start"]
    

    12. 设置默认的环境变量,映射端口和数据卷

    运行 Docker 容器时很可能需要一些环境变量。在 Dockerfile 设置默认的环境变量是一种很好的方式。另外,我们应该在 Dockerfile 中设置映射端口和数据卷。示例如下:

    FROM node:7-alpine
    
    ENV PROJECT_DIR=/app
    
    WORKDIR $PROJECT_DIR
    
    COPY package.json $PROJECT_DIR
    RUN npm install
    COPY . $PROJECT_DIR
    
    ENV MEDIA_DIR=/media \
        NODE_ENV=production \
        APP_PORT=3000
    
    VOLUME $MEDIA_DIR
    EXPOSE $APP_PORT
    
    ENTRYPOINT ["./entrypoint.sh"]
    CMD ["start"]
    

    ENV指令指定的环境变量在容器中可以使用。如果你只是需要指定构建镜像时的变量,你可以使用ARG指令。

    13. 使用 LABEL 设置镜像元数据

    使用LABEL指令,可以为镜像设置元数据,例如镜像创建者或者镜像说明。旧版的 Dockerfile 语法使用MAINTAINER指令指定镜像创建者,但是它已经被弃用了。有时,一些外部程序需要用到镜像的元数据,例如nvidia-docker需要用到com.nvidia.volumes.needed。示例如下:

    FROM node:7-alpine
    LABEL maintainer "jakub.skalecki@example.com"
    ...
    

    14. 添加 HEALTHCHECK

    运行容器时,可以指定--restart always选项。这样的话,容器崩溃时,Docker 守护进程(docker daemon)会重启容器。对于需要长时间运行的容器,这个选项非常有用。但是,如果容器的确在运行,但是不可(陷入死循环,配置错误)用怎么办?使用HEALTHCHECK指令可以让 Docker 周期性的检查容器的健康状况。我们只需要指定一个命令,如果一切正常的话返回 0,否则返回 1。对 HEALTHCHECK 感兴趣的话,可以参考这篇博客。示例如下:

    FROM node:7-alpine
    LABEL maintainer "jakub.skalecki@example.com"
    
    ENV PROJECT_DIR=/app
    WORKDIR $PROJECT_DIR
    
    COPY package.json $PROJECT_DIR
    RUN npm install
    COPY . $PROJECT_DIR
    
    ENV MEDIA_DIR=/media \
        NODE_ENV=production \
        APP_PORT=3000
    
    VOLUME $MEDIA_DIR
    EXPOSE $APP_PORT
    HEALTHCHECK CMD curl --fail http://localhost:$APP_PORT || exit 1
    
    ENTRYPOINT ["./entrypoint.sh"]
    CMD ["start"]
    

    当请求失败时,curl --fail 命令返回非 0 状态。

     

    参考:

    https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/

    https://rock-it.pl/how-to-write-excellent-dockerfiles/

    展开全文
  • 本文讲的是Dockerfile优化经验浅谈,【编者的话】本文主要讲述如何优化Dockerfile,来缩短docker镜像构建需要的时间,以及Dockerfile的一些编辑规范,推荐所有的Docker爱好者阅读,非常基础的文章,本文也许会给你...
    本文讲的是Dockerfile之优化经验浅谈【编者的话】本文主要讲述如何优化Dockerfile,来缩短docker镜像构建需要的时间,以及Dockerfile的一些编辑规范,推荐所有的Docker爱好者阅读,非常基础的文章,本文也许会给你一些启发和指导。

    优化您的Dockerfiles

    Docker镜像应该是小而快的。然而,假设你在BusyBox镜像中预编译GO二进制文件,他们就会变得又大又复杂。如果不能构建一个良好的Dockerfile来帮助你提高构建缓存命中率,那么你的镜像构建过程将会变得相当的缓慢。

    比如一个用于软件安装的bash脚本,里面堆砌着大量的curl、wget等命令语句,大家在写Dockerfile的时候通常就会像写这个bash脚本一样,将一系列的Docker命令堆砌在其中,这种Dockerfile在构建镜像的时候是比较低效和缓慢的。

    秩序

    当你正在为一个应用程序构建一个新的Dockerfile,在决定需要引哪些包、运行什么命令的时候肯定会进行很多次尝试,也会遇到很多的问题。优化你的Dockerfile确保命中“构建缓存”的概率越来越大,这样之后的每一次构建中会比前一次要更快一些。

    一般的规律是有频率的改变Dockerfile中命令的排序,观察分析运行命令所耗费的时间及与其他镜像共享资源的方式。

    这就意味着像WORKDIR、CMD、ENV这些命令应该在底部,然而一个RUN apt-get -y update更新应该在上面,因为它需要更长时间来运行,也可以与你所有的镜像共享。

    最后任何ADD(或其它缓存失效的命令)命令应该尽可能地在Dockerfile底部,在那里你有可能做出很多改变,然后后续命令缓存失效。

    明智地选择你的基础镜像

    在如Ubuntu这样的操作系统镜像和Python或Java7中一个特定的应用程序中,有很多基础镜像可供选择。常识告诉你使用Ruby2来运行基于Ruby应用程序并且使用Python3运行Python应用程序。但是现在你有两个几乎没有共同之处的基础镜像,所以你需要下载和构建。相反,如果你使用Ubuntu运行这两个程序,你只需要下载一次基础镜像。

    将层作为你的优势

    在一个Dockerfile中每个命令都会在原来的基础上生成一层镜像。你可以很快的在三十多层的时候就结束了,这未必是一个问题,但也可以通过组合RUN命令,并使用一行EXPOSE命令列出你所有的开放端口,这样可以有效减少镜像的层数。

    通过将RUN命令分组,可以在容器间分享更多的层。当然如果你有一组命令可以多个容器通用,那么你应该创建一个独立的基础镜像,它包含你建立的所有镜像。

    对于每一层来说你都可以跨多个镜像分享,这样可以节省大量的磁盘空间。

    容器的体积

    在创建容器并考虑到体积问题的时候,不要为了节省空间去使用体积小的镜像,尽量使用你将要提供数据的应用程序打成的镜像。如果你这样做了,并且提交了磁盘数据,你不仅在容器中储存了你的数据,而且对实际应用程序的调试也非常有用。

    消耗

    当你已经构建了一个镜像,在运行它的时候发现有一个package缺少了,把它添加到Dockerfile的底部,而不是添加到顶部的run apt-get命令那里。这意味着你能尽快的重新构建这个镜像了。一旦你的镜像可以正常工作,你可以再提交源码之前重新优化整理Dockerfile。

    案例

    如果一个Dockerfile是由类似于一个bash脚本写出来的,那么它可能会是这样的:
    FROM ubuntu:trusty
    MAINTAINER Paul Czarkowski "paul@paulcz.net"
    
    RUN apt-get -yq update
    
    # Apache
    RUN \
    apt-get -yqq install \
    apache2 \
    apache2-utils \
    libapache2-mod-python \
    python-dev \
    python-pip \
    python-cairo \
    python-pysqlite2 \
    python-mysqldb \
    python-jinja2
    sqlite3 \
    curl \ 
    wget \
    git \
    software-properties-common
    
    RUN \
    curl -sSL https://bootstrap.pypa.io/get-pip.py | python && \
    pip install whisper \
    carbon \
    graphite-web \
    'Twisted<12.0' \
    'django<1.6' \
    django-tagging
    
    # Add start scripts etc
    ADD . /app
    
    RUN mkdir -p /app/wsgi
    RUN useradd -d /app -c 'application' -s '/bin/false' graphite
    RUN chmod +x /app/bin/*
    RUN chown -R graphite:graphite /app
    RUN chown -R graphite:graphite /opt/graphite
    RUN rm -f /etc/apache2/sites-enabled/*
    
    ADD ./apache-graphite.conf /etc/apache2/sites-enabled/apache-graphite.conf
    
    # Expose ports.
    EXPOSE 80 
    EXPOSE 2003 
    EXPOSE 2004 
    EXPOSE 7002
    
    ENV APACHE_CONFDIR /etc/apache2
    ENV APACHE_ENVVARS $APACHE_CONFDIR/envvars
    ENV APACHE_RUN_USER www-data
    ENV APACHE_RUN_GROUP www-data
    ENV APACHE_RUN_DIR /var/run/apache2
    ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pid
    ENV APACHE_LOCK_DIR /var/lock/apache2
    ENV APACHE_LOG_DIR /var/log/apache2
    
    WORKDIR /app
    
    # Define default command.
    CMD ["/app/bin/start_graphite"]
    

    然而这个Dockerfile的优化版本是基于之前所讨论的内容的,它看起来是这样的:
    # 1 - Common Header / Packages
    FROM ubuntu:trusty
    MAINTAINER Paul Czarkowski "paul@paulcz.net"
    
    RUN apt-get -yq update \
    && apt-get -yqq install \
    wget \
    curl \
    git \
    software-properties-common
    
    # 2 - Python
    RUN \
    apt-get -yqq install \
    python-dev \
    python-pip \
    python-pysqlite2 \
    python-mysqldb
    
    # 3 - Apache
    RUN \
    apt-get -yqq install \
    apache2 \
    apache2-utils
    
    # 4 - Apache ENVs
    ENV APACHE_CONFDIR /etc/apache2
    ENV APACHE_ENVVARS $APACHE_CONFDIR/envvars
    ENV APACHE_RUN_USER www-data
    ENV APACHE_RUN_GROUP www-data
    ENV APACHE_RUN_DIR /var/run/apache2
    ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pid
    ENV APACHE_LOCK_DIR /var/lock/apache2
    ENV APACHE_LOG_DIR /var/log/apache2
    
    # 5 - Graphite and Deps
    RUN \
    apt-get -yqq install \
    libapache2-mod-python \
    python-cairo \
    python-jinja2 \
    sqlite3
    
    RUN \
    pip install whisper \
    carbon \
    graphite-web \
    'Twisted<12.0' \
    'django<1.6' \
    django-tagging
    
    # 6 - Other
    EXPOSE 80 2003 2004 7002
    
    WORKDIR /app
    
    VOLUME /opt/graphite/data
    
    # Define default command.
    CMD ["/app/bin/start_graphite"]
    
    # 7 - First use of ADD
    ADD . /app
    
    # 8 - Final setup
    RUN mkdir -p /app/wsgi \
    && useradd -d /app -c 'application' -s '/bin/false' graphite \
    && chmod +x /app/bin/* \
    && chown -R graphite:graphite /app \
    && chown -R graphite:graphite /opt/graphite \
    && rm -f /etc/apache2/sites-enabled/* \
    && mv /app/apache-graphite.conf /etc/apache2/sites-enabled/apache-graphite.conf
    

    1 - Common Header / Packages

    这是最常见的共享层,在同一个主机上运行所有镜像应该从它开始。你可以看到我已经添加了一些诸如curl和git的操作,他们不是必须的,但是对调试很有用。而且因为他们在分享层,所以它们不会占用太多空间。

    2 - Python, 3 - Apache

    现在说一下我们的语言规范。在这里我已经包含了python和apache的部分,因为到底把谁放在第一位并不十分清楚。如果我们把apache放在第一位,我们可以获得一个包含层和免费得到apache的ruby应用程序。

    4 - Apache Envs

    我把这些单独说出来是为了以下这些原因。

    首先,镜像中添加Apache部分之后直接构建其他需要的部分模块,以便于在构建多个镜像的过程中尽量多应用公共缓存。你也许认为这并不重要,因为类似EVN的调用是很便宜的,但是我见到过随机的ENV调用耗费了10秒钟甚至更多时间。

    有一个很好的例子:你可能想要在容器的底部启动,但这些命令不能被改变的,那么最好把他们移到略微靠前一点的地方。

    其次,我真希望Docker能够在同一行指定多个环境,这样可以减少层数,最终提供了一种最简化的构建方式。

    5 - Graphite and Deps

    这包含了一些特定的apt和pip等资源包。你可以在一个单一的命令中加入他们,利用&&符号最为分隔符,如果需要修改只需要修改这条组合命令即可。

    6 - Other

    这包含了一大堆简易的命令,如ADD和VOLUME,比起以前安装的包,他们更不可能改变,但运行的效率也不慢,所以在这些命令的缓存失效以后就会变得并不那么重要了。
    所以建议把类似的这些命令放在Dockerfile的底部。

    7 - First ADD

    你应该在最后面使用ADD命令。

    8 - Final setup

    将这些类似ADD命令的操作放入最后一层。

    最后

    希望这篇文章能够帮你编写一个更好的Dockerfile文件。这些都是我在构建我自己的镜像的时候所经历过的,虽然他们可能并不适用于所有情况(或可能是错误的),但他们确实提高了我的开发经验。

    原文链接:Optimizing your Dockerfiles (翻译:王康 翻译:李颖杰)
    ===========================
    译者介绍
    王康,现就职于sion,高级软件工程师,负责云图部署服务的相关工作。曾就职于momo。个人比较热爱新兴技术,热爱共享学习。

    原文发布时间为:2015-03-15
    本文作者:大自然保护协会志愿者-王康
    本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
    原文标题:Dockerfile之优化经验浅谈
    展开全文
  • Dockerfile优化建议

    2019-06-26 03:57:05
    2. 优化镜像大小:清理无用数据 一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。 比如centos中,用yum安装之后,及时清理...

    1. 减少镜像层

    一次RUN指令形成新的一层,尽量Shell命令都写在一行,减少镜像层。

    2. 优化镜像大小:清理无用数据

    一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。

    比如centos中,用yum安装之后,及时清理缓存

    yum clean all && rm -rf /var/cache/yum/*

    比如ubuntu中用apt-get安装,可以加上--no-install-recommends这个参数,不安装非必须的依赖包

     

    比如:RUN apt-get update && apt-get install -y --no-install-recommends curl telnet wget python-pip -y && rm -rf /var/cache/apk/* && rm -rf /var/lib/apt/lists/* && apt-get autoremove

    pip安装,加上pip --no-cache-dir
    RUN pip --no-cache-dir install httpstat

     

     

     

    参考网址:https://blog.51cto.com/lizhenliang/2363565

    转载于:https://www.cnblogs.com/tianfen/p/11045032.html

    展开全文
  • Dockerfile编写优化

    2018-07-05 17:56:59
    这里总结一下几个dockerfile优化操作 1、RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小 2、每次进行依赖安装后,记得yum clean all【centos】 yum clean all 清除缓存中的...

    编译一个简单的nginx成功以后发现好几百M。这里总结一下几个dockerfile优化操作

    1、RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小

    2、每次进行依赖安装后,记得yum clean all【centos】
    yum clean all 清除缓存中的rpm头文件和包文件

    3、选择比较小的基础镜像,比如:alpine

    展开全文
  • 大家日常构建docker镜像时,常用dockerfile生成,而dockerhub上的dockerfile也已经超过100w了。本文将在5个方面介绍,如何在生产环境中,提高docker镜像的构建速度,减小docker镜像大小,以及增强dockerfile的可操作...
  • 优化Dockerfile最佳实践

    万次阅读 2019-05-06 10:22:19
    1.原文参考 地址: https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/ 2.总结 原文总结如下: ... 该条本质上是对dockerfile在build时利用缓存的原因。 实验: 执行相同的docke...
  • 镜像的优化注意几条: 选择最精简的基础镜像 减少镜像的层数 清理镜像构建的中间产物 注意优化网络请求 尽量去用构建缓存 使用多阶段构建镜像 接下来我们以rhel7镜像构建容器,并在容器中安装nginx的...
  • 最近比较忙,实际也没有用得上。...Dockerfile reference:https://docs.docker.com/engine/reference/builder/#usage 中文介绍:https://www.cnblogs.com/boshen-hzb/p/6400272.html  https://yq.aliyun.com/...
  • Docker镜像压缩与优化

    千次阅读 2017-08-09 00:28:23
    同样功能的镜像,但是不同的Dockerfile build出来的镜像大小是不一样的,这是因为docker是由一层一层的只读层累积起来的,而这每一层就是Dockerfile中的每一条指令,所以Docker image的大小完全取决
  • Docker之镜像管理及Dockerfile

    千次阅读 2018-10-01 02:03:44
    二、Dockerfile 三、构建部署Nginx 四、构建部署Java网站 镜像:  1. 一个分层存储的文件:  优点:易于扩展、优化存储空间  2. 一个软件的环境  3. 一个镜像可以用于创建多个容器  4. 一种标准化的...
  • Dockerfile编写技巧分享

    千次阅读 2016-06-04 18:45:41
    这个sprint研究了如何将私有云dashboard和admin集成...最主要的工作就是为两个项目创建Dockerfile,使其能在我们的CI环境中构建出运行服务的镜像。经过几天的实践,发现了几个编写Dockerfile的小技巧,在此与大家分享。
  • 177. Docker镜像的分层与优化

    千次阅读 2020-09-20 13:09:05
    1. docker的镜像分层 相当于kvm 链接克隆,写时复制的...比如说使用dockerfile去创建一个最简单的hello镜像。创建好对应的dockerfile之后去进行创建: FROM alpine:latest MAINTAINER sbb CMD echo "hello world"...
  • docker DockerFile技术

    千次阅读 2020-09-01 09:56:53
    什么是docker DockerFile技术 Docker通过读取Dockerfile里面的内容可以自动build image,Dockerfile是一个包含了build过程中需要执行的所有命令的文本文件。也可以理解为Dockfile是一种被Docker程序解释的脚本,由...
  • 编写 Dockerfile 的五个最佳实践

    千次阅读 2018-08-22 08:29:23
    Dockerfile 是一个文本文件,里面包含了打包Docker镜像所需要用到的命令。Docker 可以通过读取 Dockerfile 里面的命令来自动化地构建Docker镜像。通过执行 docker build 就可以启动这样的一个自动化流程...
  • 我们使用自动程序buildimage镜像,其中过程中发现很多诡异的问题, 有很多尚在解决中, 但是同时buildimage, 高频度的连续buildimage依然有部稳定的情况,特别在超过5G以上的镜像时,发生的概率极高. ...
  • Docker:使用多阶段构建镜像

    千次阅读 2017-12-22 23:19:32
    这对致力于优化 Dockerfile 的人来说,使得 Dockerfile 易于阅读和维护。-- Docker本文导航◈ 在多阶段构建之前09%◈ 使用多阶段构建50%◈ 命名您的构建阶段76%编译自 | ...
  • 容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右并且一直在完善、补充具体的细节和实践,...
  • 1.自定义镜像mycentos ...dockerFile: FROM centos MAINTAINER liuq<wangwanhong> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 ...
  • Docker使用TensorFlow Serving

    千次阅读 2017-12-05 17:45:14
    哪些容器存在 构建一个镜像 运行一个容器 构建过程总结 这个目录包含Dockerfiles,使得通过Docker启动和运行TensorFlow服务变得非常容易。Docker安装一般安装说明在Docker网站上,但是我们在这里给出一些快速链接: ...
  • 使用Dockerfile在docker上构建基于alpine的Django运行环境并部署Django项目 oyealex 使用Dockerfile在docker上构建基于alpine的Django运行环境并部署Django项目 Dockerfile 部分说明 安装bash和python3 安装...
1 2 3 4 5 ... 20
收藏数 3,860
精华内容 1,544
关键字:

dockerfile优化