Docker build在OSX报/srv/app/www不存在 同配置Windows可正常运行
问题原因分析
- 首先可以先排除你之前尝试的配置方向:
.gitattributes中添加* text=auto是用于统一跨系统的文本文件换行符规则,和本次路径找不到的错误没有关联,不需要在这个方向继续排查。 - 你Dockerfile中
staging阶段的CMD ["mkdir","/srv/app"]属于无效配置:CMD指令仅在容器启动时执行,镜像构建过程中不会运行该命令。不过WORKDIR指令会自动创建不存在的目标目录,所以这不是本次构建失败的根因。 - 核心原因大概率是大小写敏感性差异:
Windows系统的NTFS文件系统默认大小写不敏感,而构建使用的alpine Linux容器内部是大小写严格敏感的。如果你的build-staging脚本输出的目录实际名称不是全小写的www(比如是WWW、Www等),在Windows环境下构建时,路径匹配会忽略大小写差异,所以COPY指令能正常找到目录;但在OSX环境运行Docker构建时,容器内部的Linux文件系统严格区分大小写,就会找不到你写的/srv/app/www路径。 - 其他可能的排查方向:
- 检查OSX设备上构建时
npm run-script build-staging阶段的日志,确认是否存在构建静默失败的情况:部分前端构建工具在遇到非致命警告时,Windows环境返回构建成功,OSX环境虽然也返回成功但实际没有生成输出目录。 - 检查两个项目的
.dockerignore配置差异,确认是否当前项目的.dockerignore里忽略了www目录相关的路径,或者OSX环境下存在大小写不一致的.dockerignore规则匹配到了输出目录。
- 检查OSX设备上构建时
修复方案
- 先临时修改Dockerfile定位问题:在builder阶段的构建指令后加目录打印语句,确认输出目录的实际名称,将
RUN ["npm","run-script","build-staging"]改成RUN npm run-script build-staging && ls -la /srv/app,执行构建看输出的目录列表,确认是否存在www目录、或者实际名称有大小写差异。 - 如果确实是大小写问题,要么修改build脚本的输出路径为统一的小写
www,要么修改COPY指令的路径和实际输出路径保持完全一致。 - 额外优化:删掉staging阶段无效的
CMD ["mkdir","/srv/app"],多余的重复WORKDIR也可以删掉,减少冗余配置。
内容的提问来源于stack exchange,提问作者Jeremy Friesen
相关产品推荐
相关产品推荐

