代码之家  ›  专栏  ›  技术社区  ›  cdarwin

构建docker映像时的最佳实践

  •  0
  • cdarwin  · 技术社区  · 7 年前

    我是Docker的新手,我正在尝试用Firefox56构建一个图像,我想知道什么是最好的方法。

    Dockerfile文件 用手

    在我看来,最好的方法是使用Dockerfile,但是每次我出错时,Dockerfile中安装的命令都会重新下载并重新安装wget和gtk包,这是一个漫长的过程。是否有一种方法可以缓存我在构建过程中已经下载的内容?

    我当前使用的Dockerfile如下所示,尽管它不是完全相关的(在当前版本中,命令似乎还可以)。

    FROM ubuntu:14.04
    
    RUN apt-get update && apt-get install -y wget gtk3.0
    
    # Replace 1000 with your user / group id
    RUN export uid=1000 gid=1000 && \
        mkdir -p /home/developer && \
        echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
        echo "developer:x:${uid}:" >> /etc/group && \
        echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
        chmod 0440 /etc/sudoers.d/developer && \
        chown ${uid}:${gid} -R /home/developer && \
        cd /tmp && wget http://ftp.mozilla.org/pub/firefox/releases/56.0/linux-x86_64/en-US/firefox-56.0.tar.bz2 && tar -xjf firefox-56.0.tar.bz2 && mv firefox /opt 
    
    USER developer
    ENV HOME /home/developer
    CMD /opt/firefox/firefox
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   David Maze    7 年前

    根本不在Docker容器中运行它们 . 有三大原因:您需要为容器执行许多复杂的非默认操作,以便访问主机显示和设备;为了让容器能够访问用户的首选项,您需要做很多复杂的非默认的事情;您需要是root用户才能启动Docker容器(这是不好的),正确管理文件权限很棘手。

    否则:基本上应该始终使用Dockerfile和 docker build docker commit 几乎总是错的 . 如果你有一个Dockerfile,你可以把它提交给源代码管理,交给你的同事,并记住你六个月后是如何构建它的;如果你从一个容器提交一个图像,你就不能做这些事情,当你离开你的项目,你的同事发现你的图像有一个很大的安全漏洞,这将是一个大问题。

    Docker将自己缓存每个步骤的结果:如果上一步的结果没有更改,并且此步骤运行相同的命令,那么它将重用上一个构建的结果。虽然它的最佳实践是将所有内容压缩到最终构建的单个运行命令中,但在开发过程中,将其拆分为多个步骤非常有用,这样您就可以缓存下载步骤。

    # Squish these steps together when it really works
    RUN cd /tmp && wget https://...
    RUN tar xjf /tmp/firefox-56.0.tar.bz2 -C /opt
    
    推荐文章