如何从Windows共享D盘复制文件到Docker镜像?ADD指令执行失败求助
解决Docker构建时无法访问Windows D盘文件的问题
从你的错误信息来看,核心问题是Docker构建上下文的限制,以及Windows路径在Docker环境里的写法不对。Docker执行ADD指令时,只会去你指定的构建上下文目录(默认是执行docker build命令时的当前目录)里找文件,而你直接写了d:/...这种Windows绝对路径,Docker会把它当成上下文目录下的子目录,自然找不到对应的文件。
下面给你几个可行的解决方案,按推荐程度排序:
方案一:把文件放到构建上下文目录(最稳妥)
这是Docker构建的标准做法,能从根源避免路径问题:
- 把
d:/Application_Build/spring-tournament-portal-0.0.1-SNAPSHOT整个文件夹复制到你的Dockerfile所在的目录(比如可以建个build-artifacts子目录专门存放构建产物) - 修改Dockerfile里的
ADD指令为相对路径:ADD ./build-artifacts/${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION} - 执行
docker build时,确保当前工作目录是Dockerfile所在的目录,这样Docker就能在上下文里顺利找到你的文件。
方案二:指定构建上下文为D盘的目标目录(适合不想复制文件的场景)
如果你不想复制文件,可以直接把构建上下文指向D盘的Application_Build目录:
- 假设你的Dockerfile在
C:/Projects/my-app/Dockerfile,执行构建命令时这样写:docker build -t my-tomcat-app -f C:/Projects/my-app/Dockerfile d:/Application_Build - 此时Docker的构建上下文是
d:/Application_Build,所以Dockerfile里的ADD指令可以简化为:
注意:这种方式会把ADD ./${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION}d:/Application_Build下的所有文件都发送给Docker daemon,如果这个目录很大,构建速度会明显变慢。
方案三:用BuildKit挂载宿主机路径(适合大文件/频繁更新的场景)
如果你的构建产物很大,或者不想每次都复制文件,可以用Docker的BuildKit特性直接挂载宿主机路径:
- 先开启BuildKit:
- Windows CMD:
set DOCKER_BUILDKIT=1 - Windows PowerShell:
$env:DOCKER_BUILDKIT=1 - 或者在Docker Desktop的设置里,找到
Builds选项,勾选Use BuildKit for building
- Windows CMD:
- 修改Dockerfile,把
ADD指令换成带挂载的RUN命令:
这里通过RUN --mount=type=bind,source=/d/Application_Build/${ARTIFACT}-${VERSION},target=/tmp/app \ cp -r /tmp/app /opt/tomcat/webapps/${ARTIFACT}-${VERSION}--mount把宿主机的D盘路径直接挂载到构建容器的/tmp/app目录,再复制到目标路径,不需要把文件加入构建上下文。
额外注意事项
- 确保Docker Desktop已经共享了D盘:打开Docker Desktop设置 ->
Resources->File Sharing,勾选D盘,点击Apply & Restart生效。 - 构建时要正确传递环境变量,比如
ARTIFACT和VERSION,可以用--build-arg参数:docker build --build-arg ARTIFACT=spring-tournament-portal --build-arg VERSION=0.0.1-SNAPSHOT ...
内容的提问来源于stack exchange,提问作者sdindiver
相关产品推荐
相关产品推荐

