Dockerfile如何用单条COPY指令实现多资源拷贝到不同目标路径
问题解答
可以实现,有两种常用方案:
方案1:提前整理本地目录结构
你只需要先把本地要拷贝的内容按照容器内的目标路径结构整理好,就能用单条COPY指令完成。
举个例子,你在本地构建上下文根目录下新建一个叫docker_root的文件夹,内部结构按容器内的路径搭建:
docker_root/ ├── app/ │ ├── dir1/ # 放入原来dir1的所有内容 │ ├── dir2/ # 放入原来dir2的所有内容 │ └── file1 # 放入原来的file1
然后Dockerfile里只要写一行即可:
COPY docker_root/ /
这一步会把docker_root下的所有内容按目录结构直接映射到容器根目录,完全符合你要的路径要求,且只会生成1层镜像层。
方案2:多源COPY语法(Docker 17.05+版本支持)
如果你不想改动本地原有目录结构,还可以用Docker后续版本支持的多源COPY规则,注意只有最后一个参数是目标路径,前面所有参数都是源路径,要求源路径的目录结构和目标路径下的结构完全匹配:
你的场景里源的dir1、dir2、file1刚好和目标路径/app下的结构对应,所以可以直接写:
COPY dir1/ dir2/ file1 /app/
⚠️ 这个方案存在限制:所有源文件/目录的层级必须和目标路径下的层级对应,不能给不同源指定完全独立的不同目标路径。如果你的源和目标的目录结构不匹配,还是只能用第一种方案。
补充说明:不建议用
ADD指令实现这个需求,ADD额外支持自动解压压缩包、拉取远程文件的特性,对于本地普通文件拷贝的场景,COPY语义更清晰也更安全。
内容的提问来源于stack exchange,提问作者Zeid ALSeryani
相关产品推荐
相关产品推荐

