使用一个命令复制多个目录

时间:2016-06-09 00:49:10

标签: docker copy dockerfile

有没有办法在一个命令中复制多个目录,以减少层数?例如,而不是:

COPY dirone ./dirone
COPY dirtwo ./dirtwo
COPY dirthree ./dirthree

我想这样做:

COPY dirone/ dirtwo/ dirthree/ ./

但是,这会复制目录的内容 ...但我想复制目录

3 个答案:

答案 0 :(得分:17)

复制命令的记录行为:

  

如果<src>是目录,则复制目录的全部内容,包括文件系统元数据。

     

注意:目录本身不会被复制,只会复制其内容。

我建议的最佳解决方法是更改​​构建文件夹中的目录布局,将三个文件夹移到一个父文件夹下并添加父文件夹。

答案 1 :(得分:8)

作为BMitch answered,这是预期的COPY行为。

另一种选择是ADD tarball的内容。

创建初始tarball

tar -cvf dirs.tar dirone/ dirtwo/ dirthree/

将其添加到构建

FROM busybox
ADD dirs.tar /
CMD find /dirone /dirtwo /dirthree

自动提取tarball

○ →docker run c28f96eadd58
/dirone
/dirone/one
/dirtwo
/dirtwo/two
/dirthree
/dirthree/three

注意每次更新tar文件时,都会使该步骤的Docker构建缓存失效。如果您正在处理大量文件,那么在执行tar -c时您可能想要聪明一些。如果您可以处理未从tarball中自动删除的文件,也可以使用tar -u

[ -f dirs.tar ] && tar -uf dirs.tar something || tar -cf dirs.tar something

答案 2 :(得分:0)

实际的解决方案,不会改变你的代码,只会使用 dockerfile

COPY . /tmp/
WORKDIR /tmp/
RUN cp -r dirone/ dirtwo/ dirthree/ /full_path_to_app/
WORKDIR /full_path_to_app/

请注意:

  • 您需要在 /tmp 之后将您的工作目录改回一些有用的东西。
  • 您可以在没有 workdir 的情况下执行此操作,但是您需要重复路径 RUN cp -r /tmp/dirone/ /tmp/dirtwo/ /tmp/dirthree/ ./
  • 目标路径必须是绝对路径,否则会和workdir相关
  • 目的地应以 / 结尾