Docker COPY不遵守.dockerignore规则,访问无权限tmpdata报错如何解决?
问题根因
你遇到的报错并非来自Dockerfile的COPY指令执行阶段,而是出在更早的构建上下文准备阶段,和你写的COPY规则无关:
- Docker执行
docker build时,首先会由Docker客户端遍历你指定的构建上下文目录(默认是执行命令的当前目录),收集所有文件后传给Docker守护进程。 - 你当前
.dockerignore里写的规则是tmpdata/,带尾部斜杠的匹配规则要求Docker先确认目标是目录才能命中忽略规则,因此客户端会尝试访问、打开tmpdata目录来验证类型,这个动作直接触发了权限不足报错,此时还没到应用忽略规则、执行COPY指令的步骤。 - 你重构为选择性COPY仍然报错的原因也在这里:问题出在上下文收集阶段,和COPY指令怎么写没有关系。
解决方法
方案1(最便捷):修改.dockerignore规则
把.dockerignore里的tmpdata/改为tmpdata(去掉尾部斜杠):
# 原来的规则 tmpdata/ # 修改为 tmpdata
不带尾部斜杠的规则会直接匹配所有名为tmpdata的文件、目录、软链接,Docker客户端遍历到根目录下的tmpdata时会直接命中忽略规则,不需要尝试访问目录内容,自然不会触发权限报错。
方案2(可选):调整目录权限
如果必须保留tmpdata/的匹配规则,可以给执行docker build的用户开放tmpdata目录的读权限,Docker客户端就能正常完成目录类型校验、命中忽略规则,不会再报错。如果你不想开放权限,优先选方案1即可。
注意:修改规则后如果仍然报错,请确认
.dockerignore文件放在你执行docker build命令的根目录下,不要放在子目录中,否则规则不会生效。
内容的提问来源于stack exchange,提问作者yen
相关产品推荐
相关产品推荐

