Docker如何添加文件而不将其提交给图像?

Chr*_*now 8 docker dockerfile

我有一个~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
Run Code Online (Sandbox Code Playgroud)

问题:ADD本地文件是否有解决办法而不会导致提交?

一种选择是python -m SimpleHTTPServer在启动docker构建之前运行一个简单的Web服务器(例如),然后使用它wget来检索文件,但这看起来有点乱:

RUN wget http://localhost:8000/apache-stratos.zip && \
    unzip -q apache-stratos.zip && \
    rm apache-stratos.zip && \
    mv apache-stratos-* apache-stratos
Run Code Online (Sandbox Code Playgroud)

另一个选择是在容器启动时提取压缩文件而不是构建时间,但我希望尽可能快地保持启动.

Ali*_*man 15

根据文档,如果您将存档文件从本地文件系统(不是URL)传递到Dockerfile中的ADD(具有目标路径,而不是路径+文件名),它会将文件解压缩到给定的目录中.

如果<src>是可识别的压缩格式(identity,gzip,bzip2或xz)的本地tar存档,则将其解压缩为目录.远程URL中的资源不会被解压缩.复制或解压缩目录时,它与tar -x具有相同的行为:结果是以下联合:

1)无论目的地路径上存在什么,2)源树的内容,冲突得到解决,有利于"2".在逐个文件的基础上.

尝试:

ADD /files/apache-stratos.zip /opt/
Run Code Online (Sandbox Code Playgroud)

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

  • 似乎没有解压缩Docker 1.2.0上的`.zip`文件. (10认同)
  • ADD不支持`.zip`文件的事实似乎是一个预期的决定:https://github.com/docker/docker/issues/15036 (2认同)
  • *这个答案实际上不起作用* ``ADD /files/apache-stratos.zip /opt/`` 制作了一个名为 ``/opt/apache-stratos.zip`` 的文件 (2认同)

aug*_*rar 5

使用 Docker 17.05+,您可以使用多阶段构建来避免创建额外的层。

FROM ... as stage1
# No need to clean up here, these layers will be discarded
ADD /files/apache-stratos.zip /opt/apache-stratos.zip
RUN unzip -q apache-stratos.zip
    && mv apache-stratos-* apache-stratos

FROM ...
COPY --from=stage1 apache-stratos/ apache-stratos/
Run Code Online (Sandbox Code Playgroud)