有没有办法在一个命令中复制多个目录,以减少层数?例如,而不是:
COPY dirone ./dirone
COPY dirtwo ./dirtwo
COPY dirthree ./dirthree
我想这样做:
COPY dirone/ dirtwo/ dirthree/ ./
但是,这会复制目录的内容 ...但我想复制目录。
答案 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/
请注意:
RUN cp -r /tmp/dirone/ /tmp/dirtwo/ /tmp/dirthree/ ./
/
结尾