我是 Docker 新手,我正在尝试使用 firefox 56 构建镜像。我想知道最好的方法是什么。
据我所知,有两种方法。
一种是创建 Dockerfile ,另一个是打开一个shell到一个现有的图像,修改它手工 ,并提交更改(docker commit)。
在我看来,最好的方法是使用 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
最佳答案
对于像 Firefox 这样的交互式桌面应用程序,它在很大程度上取决于最终用户的偏好,恕我直言,最佳实践是 根本不在 Docker 容器中运行它们 .造成这种情况的三大原因:您需要为容器做很多复杂且非默认的事情才能访问主机显示和设备;您需要为容器做很多复杂且非默认的事情才能访问用户首选项;并且您需要是 root 才能启动 Docker 容器(这很糟糕),并且正确管理文件权限很棘手。
否则:您基本上应该始终使用 Dockerfile 和 docker build
系统和 docker commit
几乎总是错的 .如果你有一个 Dockerfile,你可以将它提交到源代码控制,把它交给你的同事,并记住六个月后你是如何构建它的;如果你从一个容器中提交一个镜像,你就不能做这些事情,当你离开你的项目并且你的同事发现你的镜像存在严重的安全漏洞时,这将是一个大问题。
Docker 会自行缓存每一步的结果:如果上一步的结果没有改变,并且这一步运行相同的命令,那么它将重用上一步的构建结果。虽然将所有内容压缩到单个 RUN 命令中以进行最终构建是最佳实践,但在开发过程中,将其拆分为多个步骤非常有帮助,这样您就可以缓存下载步骤。
# Squish these steps together when it really works
RUN cd /tmp && wget https://...
RUN tar xjf /tmp/firefox-56.0.tar.bz2 -C /opt
关于docker - 构建 docker 镜像时的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52779546/