Docker多阶段构建无法将第一阶段编译的二进制复制到第二阶段
问题根因
你的怀疑完全正确,问题就出在docker-compose的volumes挂载配置上:
你在Dockerfile的RUN阶段将编译生成的.tsk文件复制到了镜像内的/workarea路径下,但docker-compose中配置了- .:/workarea绑定挂载,容器启动时会直接用宿主机当前目录覆盖容器内的/workarea整个目录。只要你宿主机本地目录下没有对应编译产物,容器内就看不到镜像里COPY进去的文件。
解决方案
你可以根据自己的使用场景选对应方案:
- 如果不需要将本地目录同步到容器内,直接删除docker-compose.yaml中的
volumes配置项即可,容器会直接使用镜像内置的/workarea目录下的所有文件。 - 如果确实需要挂载本地目录做开发调试,可以选以下两种方案之一:
- 修改编译产物的COPY目标路径,不要放在
/workarea下,比如改为/opt/build_output这类不会被挂载的路径,使用时直接从新路径调取文件即可。 - 给挂载配置增加匿名卷排除编译产物目录,修改volumes配置为:
这样volumes: - .:/workarea - /workarea/cmake-build/workarea/cmake-build目录不会被宿主机目录覆盖,镜像中内置的编译产物会被保留。 - 修改编译产物的COPY目标路径,不要放在
验证方法
你可以先临时注释掉docker-compose中的volumes配置,再启动容器执行ls命令,确认文件正常存在即可验证是挂载覆盖导致的问题。
内容的提问来源于stack exchange,提问作者ghostrider
相关产品推荐
相关产品推荐

