Docker容器内首次构建ROS2工作空间找不到ament_cmake问题求助
问题根因
docker/build脚本的环境变量加载逻辑错误:你写的/bin/bash -c "source /opt/ros/foxy/setup.bash"是启动了独立的子shell执行source命令,source加载的ROS环境变量仅在这个子shell内生效,子shell退出后,执行后续colcon build的父shell根本没有拿到ROS相关的环境变量,导致CMake找不到ament_cmake等ROS依赖包。- docker exec默认启动非交互式shell:你在Dockerfile中把ROS的source命令写入了
/etc/bash.bashrc,但这个配置仅对交互式shell生效,docker exec默认执行的是非交互式shell,不会加载该配置,也不会自动导入ROS环境。 - 手动执行和后续执行成功的原因:
- 手动
docker attach进入的是交互式shell,会自动加载/etc/bash.bashrc中的ROS环境配置,执行colcon build时环境变量正常。 - 手动构建成功后,工作空间下会生成
install/setup.bash等配置,后续执行脚本时即使上层环境没加载,colcon也能识别到已有工作空间的环境,所以不会报错。
- 手动
修复方案
修改docker/build脚本内容,将source命令和colcon build放在同一个执行上下文中:
#!/bin/bash set -eu -o pipefail # project root directory, passed from ../build-in-docker cd "$1" # 直接在当前脚本shell中加载ROS环境,不要开启子shell source /opt/ros/foxy/setup.bash colcon build
也可以合并为单行执行避免shell兼容问题:
/bin/bash -c "source /opt/ros/foxy/setup.bash && colcon build"
内容的提问来源于stack exchange,提问作者zhoudingjiang
相关产品推荐
相关产品推荐

