You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Docker cp对已停止容器使用通配符失效?技术问题求助

解决Docker容器退出后提取Maven构建产物失败的问题

我来帮你排查一下这个docker cp提取war包失败的问题,大概率是这几个原因之一,咱们一个个来解决:

1. 容器已经被自动删除

很多时候运行容器时会默认加上--rm参数(有些Dockerfile或者脚本会自动配置),容器执行完命令退出后就会被自动删除,这时候你再用容器ID去拷贝文件肯定找不到。

  • 先确认容器是否还存在:执行docker ps -a,看看列表里有没有你刚运行的那个容器。如果找不到,说明已经被删了。
  • 重新运行容器时保留容器实例:给容器起个名字,避免自动删除
    docker run --name maven-build-container build-image "mvn clean package -f ./pom.xml"
    
    之后拷贝时直接用容器名代替ID:
    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/bash
    
    然后执行ls /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

火山引擎 最新活动