docker如何添加一个文件,而不是提交到一个图像?

我有一个〜300Mb的压缩本地文件,我添加到docker的图像。 下一个状态然后提取图像。

问题是ADD语句导致提交导致新的文件系统层使图像大于它所需要的300Mb。

ADD /files/apache-stratos.zip /opt/apache-stratos.zip RUN unzip -q apache-stratos.zip && \ rm apache-stratos.zip && \ mv apache-stratos-* apache-stratos 

问题 :是否有解决方法来添加本地文件而不会导致提交?

一个select是在启动Docker构build之前运行一个简单的Web服务器(例如python -m SimpleHTTPServer ),然后使用wget来检索文件,但是这看起来有点麻烦:

 RUN wget http://localhost:8000/apache-stratos.zip && \ unzip -q apache-stratos.zip && \ rm apache-stratos.zip && \ mv apache-stratos-* apache-stratos 

另一个select是在容器启动时提取压缩文件,而不是build立时间,但我宁愿保持尽可能快的启动。

根据文档 ,如果你将本地文件系统(不是URL)的档案文件传递给Dockerfile中的ADD(带有目标path,而不是path+文件名),它将把文件解压缩到给定的目录中。

如果<src>是一个识别压缩格式的本地tar档案(identity,gzip,bzip2或xz),那么它就被解压缩为一个目录。 来自远程URL的资源不被解压缩。 当一个目录被拷贝或解压时,它和tar -x具有相同的行为:结果是下面的联合:

1)无论在目的地path上存在什么,以及2)源树的内容,解决冲突为“2”。 在逐个文件的基础上。

尝试:

 ADD /files/apache-stratos.zip /opt/ 

并查看文件是否存在,无需进一步解压缩。

您可以使用docker-squash来挤压新创build的图层。 这应该大大减less图像的大小。

不幸的是,上面提到的解决方法( RUN curl ... && unzip ... & rm ... ,在容器启动时解压缩)是目前唯一的选项(docker 1.11)。