version: '3.8' services: ros2-unity: build: context: .. dockerfile: docker/Dockerfile container_name: unity-ros2-system hostname: ros2-unity # 网络配置 ports: - "9090:9090" # Rosbridge WebSocket端口 - "10000:10000" # ROS-TCP-Endpoint主端口 - "10001:10001" # 备用端口1 - "10002:10002" # 备用端口2 - "11311:11311" # ROS Master端口 (如果需要ROS1桥接) # 环境变量 environment: - ROS_DOMAIN_ID=0 - RMW_IMPLEMENTATION=rmw_fastrtps_cpp - ROS_LOCALHOST_ONLY=0 - PYTHONUNBUFFERED=1 - DISPLAY=${DISPLAY:-:0} # 卷挂载 volumes: - ../ros2-workspace:/ros2_ws_host:rw # 主机工作空间源码 - ../configs:/ros2_ws/configs:ro - ../logs:/ros2_ws/logs:rw - /tmp/.X11-unix:/tmp/.X11-unix:rw # X11转发 (Linux GUI支持) # 网络模式 network_mode: bridge # 重启策略 restart: unless-stopped # 健康检查 healthcheck: test: ["CMD", "/bin/bash", "-c", "source /opt/ros/jazzy/setup.bash && ros2 node list"] interval: 30s timeout: 10s retries: 3 start_period: 40s # 资源限制 deploy: resources: limits: memory: 4G cpus: '2.0' reservations: memory: 2G cpus: '1.0' # 交互式终端 stdin_open: true tty: true # 启动命令 command: > bash -c " source /opt/ros/jazzy/setup.bash && if [ -f /ros2_ws/install/setup.bash ]; then source /ros2_ws/install/setup.bash; fi && echo '启动ROS2 Unity系统...' && ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0 -p ROS_TCP_PORT:=10000 " # 可选:ROS2监控服务 ros2-monitor: build: context: .. dockerfile: docker/Dockerfile container_name: ros2-monitor depends_on: - ros2-unity environment: - ROS_DOMAIN_ID=0 - RMW_IMPLEMENTATION=rmw_cyclonedds_cpp volumes: - ../logs:/ros2_ws/logs:rw command: > bash -c " echo '启动ROS2监控服务...' sleep 10 while true; do echo '=== ROS2 系统状态 ===' echo '节点列表:' ros2 node list || echo '无活动节点' echo '话题列表:' ros2 topic list || echo '无活动话题' echo '服务列表:' ros2 service list || echo '无活动服务' echo '========================' sleep 30 done " profiles: - monitoring networks: default: driver: bridge ipam: config: - subnet: 172.20.0.0/16