Dockerfile中COPY指令目标路径写文件名和./是否等价?
结论
两种写法绝大多数场景下效果完全一致,最终都会将宿主机构建上下文中的filename.txt,写入镜像当前工作目录(由WORKDIR指令指定,未显式声明时默认为根目录/)下的filename.txt,不会修改目标文件名。
两种写法的注意事项
COPY filename.txt filename.txt 写法注意
- 该写法的第二个参数会被Docker识别为目标文件路径,如果此前镜像层中已经存在名为
filename.txt的目录,指令会直接抛出错误,无法完成构建,这一特性反而可以提前校验目标路径是否符合预期,避免非预期的目录覆盖问题。 - 如果后续需要调整源文件名,需要同步修改第二个目标参数,维护成本略高。
- 适合后续可能需要修改目标文件名的场景,需要调整时直接修改第二个参数即可,不需要调整指令结构。
COPY filename.txt ./ 写法注意
- 作为目录的目标路径必须以斜杠
/结尾,虽然单文件复制场景下漏写为COPY filename.txt .也能正常运行,但如果后续扩展为多文件复制、源路径改为目录时,漏写结尾斜杠会导致Docker将目标识别为文件,抛出构建错误。 - 灵活度更高,如果后续修改了
WORKDIR的取值,不需要调整COPY指令的参数,目标路径会自动适配新的工作目录。 - 存在隐含风险:如果源路径不小心误写为同名目录(比如构建上下文中刚好存在名为
filename.txt的目录),该写法会将整个目录复制到工作目录下的filename.txt子目录中,不会提前报错,容易出现非预期的构建结果。
内容的提问来源于stack exchange,提问作者Meow_ly
相关产品推荐
相关产品推荐

