Docker向Windows复制文件异常及程序加载报错问题咨询
首先可以明确:你的问题确实和NTFS的大小写敏感性配置直接相关,尤其是Windows Server 2019环境下的Windows容器场景,下面逐一拆解原因并给出解决方案:
一、文件名自动转小写的原因
Windows NTFS文件系统默认是「大小写不敏感但保留大小写」(Case Insensitive, Case Preserving)的模式——也就是说,系统会将A.B.C.dll和a.b.c.dll视为同一个文件,但会保留创建文件时的大小写格式。
在Docker的COPY命令或docker cp操作中:
- 当目标路径不存在同名(忽略大小写)文件时,系统会直接保留源文件的大小写格式,所以
D.E.F.dll能正常复制。 - 当目标路径已存在同名(忽略大小写)文件时,Docker的文件复制逻辑会自动将源文件的文件名转换为目标路径现有文件的大小写格式。如果目标文件原本是全小写的
a.b.c.dll,那么覆盖后的文件就会被强制转为全小写,哪怕源文件是A.B.C.dll。
二、程序集加载异常的关联
应用框架(比如.NET)加载程序集时,会结合文件名的大小写和程序集元数据来进行识别和缓存。当你覆盖后的文件名被转为小写,而框架之前已经加载过原小写文件名的程序集时,会触发「文件已加载」的异常——本质是框架认为这是同一个程序集(因为NTFS大小写不敏感),但实际文件内容已经更新,导致缓存冲突。手动修正大小写后,文件名与框架加载缓存中的记录一致,就能正常加载新的程序集。
三、解决方法
1. 开启目标路径的NTFS大小写敏感性
在Windows容器或宿主机器的目标路径(比如./Application/bin)上,使用fsutil命令开启大小写敏感性:
fsutil.exe file setCaseSensitiveInfo "C:\Application\bin" enable
这个设置会让NTFS在该路径下区分文件名的大小写,后续的COPY或docker cp操作会严格保留源文件的大小写,不会自动转换。
2. 明确指定目标文件名
避免使用目录复制的方式,而是在COPY或docker cp时明确指定目标文件名,强制保留大小写:
- Dockerfile示例:
FROM baseImage COPY ./files/A.B.C.dll ./Application/bin/A.B.C.dll
docker cp示例:
docker cp ./files/A.B.C.dll <你的容器ID>:/Application/bin/A.B.C.dll
3. 检查容器挂载配置
如果你的容器使用了绑定挂载(bind mount),确保宿主机器上的挂载路径也开启了大小写敏感性,避免宿主文件系统的设置影响容器内的文件处理。
内容的提问来源于stack exchange,提问作者Mehdi

