尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

IsaacLab Docker 容器实战:从构建镜像到运行示例并取回实验产物

IsaacLab Docker 容器实战:从构建镜像到运行示例并取回实验产物 IsaacLab Docker 容器实战从构建镜像到运行示例并取回实验产物【免费下载链接】IsaacLabUnified framework for robot learning built on NVIDIA Isaac Sim项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLab本篇基于 IsaacLab 仓库中docs/source/deployment/run_docker_example.rst的 Docker 示例教程展开带你完整走通 Isaac Lab 的容器化开发闭环用docker/container.py一键构建并拉起容器、在容器内直接运行示例脚本产生日志、再通过 artifacts 机制把产物带回宿主机。读完后你将掌握 Isaac Lab Docker 开发环境的日常操作构建、进入、运行、取回、清理并理解其背后由 docker-compose.yaml、.env.base 和 ContainerInterface 共同支撑的挂载与命名机制。Docker 目录Isaac Lab 容器化的全部家当从 Isaac Lab 仓库根目录出发docker 目录包含所有与 Docker 相关的文件。原文档提到的三件套在当前仓库中对应为Dockerfile即 Dockerfile.base它在 NVIDIA Isaac Sim 的 NGC 基础镜像之上叠加 Isaac Lab 依赖构建出isaac-lab-base镜像其他后缀的 Dockerfile如 Dockerfile.ros2、Dockerfile.curobo则用于构建镜像扩展image extension。docker-compose.yaml即 docker-compose.yaml定义了服务isaac-lab-base、isaac-lab-ros2、GPU 资源预留、命名卷named volumes以及把宿主机目录 bind mount 进容器的规则让你在宿主机上直接编辑代码即可生效。.env当前仓库中基础构建对应 .env.base存储构建过程与容器运行所需的环境变量例如# Accept the NVIDIA Omniverse EULA by default ACCEPT_EULAY # NVIDIA Isaac Sim base image ISAACSIM_BASE_IMAGEnvcr.io/nvidia/isaac-sim # NVIDIA Isaac Sim version to use (e.g. 6.0.1) ISAACSIM_VERSION6.0.1 # Derived from the default path in the NVIDIA provided Isaac Sim container DOCKER_ISAACSIM_ROOT_PATH/isaac-sim # The Isaac Lab path in the container DOCKER_ISAACLAB_PATH/workspace/isaaclab # Docker runtime user directory DOCKER_USER_HOME/rootcontainer.py即 docker/container.py是人与这些 Docker 文件交互的统一入口脚本底层调用 docker/utils/container_interface.py 中的ContainerInterface类。它并行于基础docker compose命令提供build、start、enter、config、copy、stop六个子命令均支持可选的 profile 参数默认base以及--files追加 compose yaml、--env-files追加 .env 文件、--suffix镜像/容器名后缀等选项。此外目录下的 x11.yaml 与 utils/x11_utils.py 负责 X11 转发支持build/start时会通过x11_check决定是否把 X11 相关配置合并进 compose 参数stop时执行x11_cleanup清理这套逻辑可以在 container.py 的 main 函数 中直接看到。更完整的 Docker 安装前置条件Docker Engine 26.0.0、Docker Compose 2.25.0、NVIDIA Container Toolkit 等见 Docker Guide。构建容器一条命令拉起 isaac-lab-base在 Isaac Lab 仓库根目录下执行python docker/container.py start终端会依次完成三步拉取 Isaac Sim 基础镜像 → 在其上构建 Isaac Lab 的附加镜像层 → 以 detached后台模式运行 Isaac Lab 容器。首次构建需要数分钟后续运行由于 Docker 缓存会明显更快。从源码看start命令最终映射为docker compose --profile base --env-file .env.base up --detach --build --remove-orphans见 ContainerInterface.start如果不是baseprofile还会先单独构建 base 镜像保证扩展镜像有底层依赖。如果一切正常在终端执行docker container ls应能看到一个名为isaac-lab-base的容器CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 483d1d5e2def isaac-lab-base bash 30 seconds ago Up 30 seconds isaac-lab-base注意这里的命名规则来自 ContainerInterface 构造函数服务名固定为isaac-lab-{profile}加上可选后缀后即为容器名与镜像名镜像 tag 为latest。进入容器非 root 用户与便利别名容器就绪后从宿主机终端执行python docker/container.py enterenter的实现是对运行中的容器执行docker exec --interactive --tty container bash见 ContainerInterface.enter它只开启一个新的 bash 进程——退出该 shell 不会停掉容器本身可随时再次进入。进入后你以非 root 用户uid/gid 1000用户名为isaaclab身份位于终端中。这一点可以在 Dockerfile.base 中得到印证镜像构建最后阶段创建 uid/gid 1000 的isaaclab用户并切换USER目的是让 bind mount 的工作目录在宿主机上保持可写。该环境包含一份 Isaac Lab 仓库副本位于/workspace/isaaclab同时可以访问 Isaac Sim 的目录与库。为了日常开发方便Dockerfile.base 在运行用户的 .bashrc 中写入了一组别名alias isaaclab${ISAACLAB_PATH}/isaaclab.sh alias python${ISAACLAB_PATH}/_isaac_sim/python.sh alias pip${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip alias tensorboard${ISAACLAB_PATH}/_isaac_sim/python.sh ${ISAACLAB_PATH}/_isaac_sim/tensorboard也就是说容器内输入isaaclab即等价于执行/workspace/isaaclab/isaaclab.sh输入python则直接使用 Isaac Sim 自带的 Python 解释器/isaac-sim/python.sh无需手动管理虚拟环境。这个isaaclab入口的行为可以从宿主机上的 isaaclab.sh 理解它导出ISAACLAB_PATH、把source/isaaclab加入PYTHONPATH、优先使用 Isaac Sim 的python.sh_isaac_sim目录是构建时软链到/isaac-sim的最终exec python -c from isaaclab.cli import cli; cli()。由于所有 Python 执行都经由该脚本且工作目录为/workspace/isaaclab容器内的相对路径如logs/都会被解析到/workspace/isaaclab之下——这正是后文日志能落对位置的原因。Bind Mount 与命名卷改动即时生效产物持久保存Isaac Lab 在容器构建时会将仓库文件复制到容器内的/workspace/isaaclab因此镜像内文件的修改通常不会反映回宿主机仓库。为加速开发循环docker-compose.yaml 通过扩展字段x-default-isaac-lab-volumes做了两类挂载1. Bind mount宿主机目录直接映射进容器宿主机路径容器内路径用途../source/workspace/isaaclab/sourceIsaac Lab 源码宿主机编辑器改动即时生效无需重建镜像../scripts/workspace/isaaclab/scripts示例与教程脚本../docs/workspace/isaaclab/docs文档源码../tools/workspace/isaaclab/tools工具脚本.isaac-lab-docker-history${DOCKER_USER_HOME}/.bash_history容器内 bash 历史记录回写宿主机2. 命名卷named volumes跨容器实例持久化如isaac-lab-logs→/workspace/isaaclab/logs、isaac-lab-data→/workspace/isaaclab/data_storage、isaac-lab-docs→/workspace/isaaclab/docs/_build以及 Isaac Sim 的各级缓存卷isaac-cache-kit、isaac-cache-ov、isaac-cache-pip、isaac-cache-gl、isaac-cache-compute与日志卷isaac-logs、isaac-carb-logs等。完整卷清单及其容器内路径见 Docker Guide 的挂载卷表格。这些卷的作用在 docker-compose.yaml 的注释 中说明得很清楚一方面避免生成文件在宿主机仓库中泛滥另一方面把产物保存在持久卷中便于之后一键拷回宿主机——这正是下一节示例要演示的。示例代码log_time.py 如何把 sim_time 写成日志本教程对应的脚本是 scripts/tutorials/00_sim/log_time.py它演示了在仿真运行时产生日志输出。脚本结构如下Launch Isaac Sim Simulator first. import argparse import os from isaaclab.app import AppLauncher parser argparse.ArgumentParser(descriptionTutorial on creating logs from within the docker container.) AppLauncher.add_app_launcher_args(parser) args_cli parser.parse_args() app_launcher AppLauncher(args_cli) simulation_app app_launcher.app Rest everything follows. from isaaclab.sim import SimulationCfg, SimulationContext def main(): Main function. # Specify that the logs must be in logs/docker_tutorial log_dir_path os.path.join(logs) if not os.path.isdir(log_dir_path): os.mkdir(log_dir_path) log_dir_path os.path.abspath(os.path.join(log_dir_path, docker_tutorial)) if not os.path.isdir(log_dir_path): os.mkdir(log_dir_path) print(f[INFO] Logging experiment to directory: {log_dir_path}) # Initialize the simulation context sim_cfg SimulationCfg(dt0.01) sim SimulationContext(sim_cfg) sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0]) sim.reset() print([INFO]: Setup complete...) # Prepare to count sim_time sim_dt sim.get_physics_dt() sim_time 0.0 # Open logging file with open(os.path.join(log_dir_path, log.txt), w) as log_file: # Simulate physics while simulation_app.is_running(): log_file.write(f{sim_time} \n) # perform step sim.step() sim_time sim_dt关键点在于路径的处理对应源码 第 42–53 行脚本先以相对路径logs定位目录再用os.path.abspath()转成绝对路径。注释指出在 Docker 容器中该绝对路径会是/workspace/isaaclab/logs/docker_tutorial因为所有 Python 执行都通过/workspace/isaaclab/isaaclab.sh进行调用进程的工作目录即为/workspace/isaaclab。由于logs目录恰好是命名卷isaac-lab-logs的挂载点这个日志文件会同时落在持久卷上从而在容器销毁后依然可取回。随后主循环在每一个仿真步把sim_time追加一行写入log.txt最终得到一份每行一个仿真时间戳的日志文件。在容器内执行脚本在容器终端中执行isaaclab -p scripts/tutorials/00_sim/log_time.py运行结束后log.txt会生成在容器内的/workspace/isaaclab/logs/docker_tutorial下。按exit退出容器即可回到宿主机的IsaacLab/docker环境容器本身仍在后台运行。取回产物container.py copy 与 artifacts 目录回到宿主机后执行./container.py copy终端会打印报告列出从容器取回的产物。此时进入docker/artifacts/logs/docker_tutorial即文档中的/isaaclab/docker/artifacts/logs/docker_tutorial相对位置就能找到脚本生成的log.txt副本。这个行为背后的实现在 ContainerInterface.copy它先确认容器处于运行状态然后把容器内三个路径逐一docker cp到宿主机docker/artifacts目录docker_isaac_lab_path Path(self.dot_vars[DOCKER_ISAACLAB_PATH]) # /workspace/isaaclab artifacts { docker_isaac_lab_path.joinpath(logs): output_dir.joinpath(logs), docker_isaac_lab_path.joinpath(docs/_build): output_dir.joinpath(docs), docker_isaac_lab_path.joinpath(data_storage): output_dir.joinpath(data_storage), }也就是说artifacts下的每个子目录分别对应 Docker 卷isaac-lab-logs、isaac-lab-docs、isaac-lab-data所映射的容器目录。由于copy直接读取命名卷的内容这些产物能在不同容器实例之间持久保存并在各 image extensionbase/ros2 等之间共享。需要留意的是copy会先清空宿主机artifacts下对应目录再拷贝因此该目录里的内容是“最近一次拷贝”的快照。停止容器与释放磁盘空间取回日志后就可以停掉容器了./container.py stop从 ContainerInterface.stop 可见该命令实际执行docker compose down --volumes限定在对应 profile 下会停止并移除容器镜像本身会保留各命名卷中的内容同样保留下次start可直接复用。如果想释放镜像占用的磁盘空间文档给出的参考值约 20.1 GB且不介意下次start时重新经历构建过程可以删除镜像docker image rm isaac-lab-base之后执行docker image ls即可确认isaac-lab-base标签的镜像已消失。如还需进一步清理底层 NVIDIA 容器资源可参考 Docker 官方的docker prune命令族。另外container.sh 是旧版入口脚本已标记为弃用内部仅是转发到container.py日常请统一使用docker/container.py。小结一条命令背后的完整调用链把整个流程串起来python docker/container.py start一条命令背后是container.py 解析子命令与 profile → 构造ContainerInterface解析 .env.base 与各扩展 .env 文件、合并 docker-compose.yaml 及追加 yaml、处理 X11 转发配置→ 调用docker compose ... up --detach --build完成拉取 Isaac Sim 基础镜像、构建 Dockerfile.base 附加层、以isaaclab非 root 用户后台拉起容器。进入容器后.bashrc别名让你直接用 Isaac Sim 的 Python 解释器与isaaclabCLIbind mount 让宿主机编辑即时生效命名卷把logs/、data_storage/、docs/_build持久化copy一键搬回docker/artifactsstop移除容器但保留镜像与卷docker image rm则负责最终的磁盘回收。这条闭环覆盖了容器化机器人学习开发中最常见的日常操作也便于把 Isaac Lab 环境以一致、可复现的方式提供给团队与 CI。【免费下载链接】IsaacLabUnified framework for robot learning built on NVIDIA Isaac Sim项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLab创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表