Docker cp对已停止容器使用通配符失效?技术问题求助
解决Docker容器退出后提取Maven构建产物失败的问题
我来帮你排查一下这个docker cp提取war包失败的问题,大概率是这几个原因之一,咱们一个个来解决:
1. 容器已经被自动删除
很多时候运行容器时会默认加上--rm参数(有些Dockerfile或者脚本会自动配置),容器执行完命令退出后就会被自动删除,这时候你再用容器ID去拷贝文件肯定找不到。
- 先确认容器是否还存在:执行
docker ps -a,看看列表里有没有你刚运行的那个容器。如果找不到,说明已经被删了。 - 重新运行容器时保留容器实例:给容器起个名字,避免自动删除
之后拷贝时直接用容器名代替ID:docker run --name maven-build-container build-image "mvn clean package -f ./pom.xml"docker cp maven-build-container:/src/module1/target/*.war ./
2. 通配符被宿主机Shell解析了
你命令里的*.war会被宿主机的Shell先解析成当前目录下的war文件(如果没有就是空),而不是让Docker去容器里匹配。这时候就会出现路径找不到的错误。
- 用单引号把容器内的路径包起来,让Docker自己处理通配符:
docker cp <container-id>:'/src/module1/target/*.war' ./ - 或者更稳妥的方式:先复制整个target目录到宿主机,再筛选需要的war包
之后你在本地的docker cp <container-id>:/src/module1/target ./target目录里就能找到生成的war包了。
3. Maven构建根本没生成war包
有可能构建过程中出错了,或者子模块的pom配置不对,导致没有生成war文件。
- 先查看容器的构建日志,确认构建是否成功:
docker logs <container-id> - 如果容器还存在,启动并进入容器检查target目录:
然后执行docker start <container-id> docker exec -it <container-id> /bin/bashls /src/module1/target/看看有没有war文件。同时检查module1的pom.xml里是否配置了<packaging>war</packaging>,如果是jar的话自然不会生成war包。
4. 容器内的路径拼写错误
可能你记错了子模块的名字或者路径,比如是不是/src/module-one/target/而不是/src/module1/target/?
- 可以通过
docker inspect <container-id>查看容器的文件系统信息,或者进入容器后用find /src -name "*.war"全局搜索war文件,确认正确的路径。
内容的提问来源于stack exchange,提问作者dfsg76




