在Windows Docker镜像中使用虚拟G盘构建失败问题咨询
问题原因
你操作的核心错误是VOLUME指令的放置顺序不符合Docker构建的规则。
Dockerfile中声明VOLUME后,所有后续构建步骤对该路径的写入操作都不会被持久化到镜像层:每执行完一个RUN指令进入下一个构建层时,声明为卷的路径会被重置为空。
这就导致你第一个RUN步骤下载到G盘的文件,在第二个RUN步骤启动时已经被清空,自然会提示找不到对应文件。而容器启动后exec进入操作时,卷处于运行时可写持久化状态,所以操作可以正常执行。
修复方案
方案1:调整VOLUME指令位置
将VOLUME指令移动到所有对G盘的写入操作完成之后即可,修改后的Dockerfile示例如下:
FROM mcr.microsoft.com/windows/servercore:20H2 # 先执行所有G盘写入操作 RUN powershell wget http://some.url/file.zip -OutFile G:\file.zip RUN tar -xf G:\file.zip -C G: # 所有写入完成后再声明卷 VOLUME "G:"
方案2:删除VOLUME指令(无需对外暴露卷时推荐)
如果你完全不需要将G盘作为卷挂载到外部,只是镜像内部需要使用G盘路径,可以直接删除VOLUME指令,通过注册表映射创建虚拟G盘即可,示例如下:
FROM mcr.microsoft.com/windows/servercore:20H2 # 创建G盘映射(将G盘指向C盘的g_drive目录) RUN powershell New-Item -Path C:\g_drive -ItemType Directory -Force; ` New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices' -Name 'G:' -Value '\??\C:\g_drive' -PropertyType String # 正常操作G盘即可 RUN powershell wget http://some.url/file.zip -OutFile G:\file.zip RUN tar -xf G:\file.zip -C G:
内容的提问来源于stack exchange,提问作者geanakuch
相关产品推荐
相关产品推荐

