Docker使用ADD指令处理symlinks软链接时提示文件不存在问题咨询
问题原因
- Docker构建上下文的访问限制:执行
docker build -t test -f 7.1/Dockerfile .时,末尾的.指定了构建上下文为当前工作目录,Docker只会将该目录下的真实文件、目录打包传输给Docker daemon,绝对不会访问上下文之外的任何文件路径。你本地的etc/php是软链接,指向的/home/neubert/devops/containers/common/etc/php完全不在当前构建上下文范围内,Docker无法读取该路径的内容。 ADD指令的默认行为限制:Docker的ADD/COPY指令默认不会跟随软链接解析其指向的目标内容,仅会尝试复制软链接本身,当检测到软链接指向外部路径时,就会直接触发文件不存在的报错。- 补充排查点:可以先检查当前目录下的
.dockerignore文件,确认没有规则排除etc/或者etc/php路径,如果有匹配规则删除对应规则即可。
解决方法
你可以根据自己的使用场景选择以下任意一种方案:
- 替换软链接为真实目录
直接将/home/neubert/devops/containers/common/etc/php的完整内容复制到当前构建上下文下的etc/php路径,替换原有软链接后重新执行构建即可。 - 调整构建上下文范围
如果需要复用公共目录的内容,可以将构建上下文调整为包含公共目录的上层路径,同时修改Dockerfile内的路径匹配规则。比如进入/home/neubert/devops/目录执行构建,命令调整为:
sudo docker build -t test -f ./containers/[你的当前项目所在路径]/7.1/Dockerfile .
同时将Dockerfile中的ADD语句修改为:
ADD containers/common/etc/php /usr/local/etc/php
- 临时复制软链接内容到上下文
如果不想修改原有目录结构,可以在构建前执行命令将软链接指向的内容同步到当前上下文:
cp -Lr etc/php etc/php_temp && mv etc/php_temp etc/php
构建完成后再按需恢复原有的软链接即可。
内容的提问来源于stack exchange,提问作者neubert
相关产品推荐
相关产品推荐

