我是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
答案 0 :(得分:1)
对于像Firefox这样的交互式桌面应用程序,这在很大程度上取决于最终用户的偏好,IMHO的最佳做法是完全不在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