借一步网
作者:
在
在编程的世界里,Docker 早已不是什么新鲜玩意儿——它就像一个万能的魔法箱,能把复杂环境打包成便携的“胶囊”。然而,当这个魔法箱遇上 OpenHands 这个 AI 驱动的开发神器时,事情开始变得有趣起来。OpenHands 的默认运行时基于 Docker,不仅让 AI 开发者触手可及,还通过巧妙的设计赋予它连接本地文件系统、强化安全性的超能力。这篇文章将带你走进 OpenHands 的 Docker 运行时,看看它如何用一个容器改变软件开发的游戏规则。
想象一下,OpenHands 是一个全能的编程助手,能写代码、跑命令、修 bug,甚至还能上网找资料。要让这个“超级大脑”运转起来,Docker 就是它的魔法船。默认情况下,OpenHands 使用一个预构建的运行时镜像 docker.all-hands.dev/all-hands-ai/runtime:0.31-nikolaik,里面装载了运行服务器和基础工具(比如 Python 和 NodeJS),就像一个装备齐全的移动工作站。
docker.all-hands.dev/all-hands-ai/runtime:0.31-nikolaik
启动它只需一行命令:
docker run -it --rm --pull=always \ -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.31-nikolaik \ -p 3000:3000 \ docker.all-hands.dev/all-hands-ai/openhands:0.31
几秒钟后,你就能在 http://localhost:3000 看到 OpenHands 的身影。它就像一个漂浮在 Docker 海洋上的智能岛屿,随时待命为你服务。不过,这个岛屿的真正魔力,还在于它能与你的本地世界无缝连接。
http://localhost:3000
OpenHands 不甘心只待在自己的容器里当个“孤岛”,它更想跳进你的代码库,和你并肩作战。要实现这一点,只需通过 Docker 的卷挂载功能,把本地文件系统“嫁接”到它的运行时中。操作起来就像给魔法船装上一个传送门:
首先,定义一个本地目录作为工作区,比如你的项目文件夹。用环境变量 WORKSPACE_BASE 来标记它:
WORKSPACE_BASE
# Linux 或 Mac 示例 export WORKSPACE_BASE=(id -u) \ -e WORKSPACE_MOUNT_PATH=WORKSPACE_BASE:/opt/workspace_base \ -p 3000:3000 \ docker.all-hands.dev/all-hands-ai/openhands:0.31
-v 参数就像一根魔法绳,把你的本地目录绑到了容器的 /opt/workspace_base 上。从此,OpenHands 就能直接访问、修改你的代码文件,仿佛它就坐在你旁边敲键盘。
-v
/opt/workspace_base
不过,这种连接也有风险。文档里特别提醒:“没有什么能阻止 OpenHands 删除或修改挂载进工作区的文件。”这就像把家门钥匙交给一个勤快但偶尔毛手毛脚的机器人——它可能会把房间打扫得一尘不染,也可能不小心把你的收藏夹扔进垃圾桶。为了避免意外,建议先备份重要文件,或者用一个测试目录来“试水”。
还有个小细节:文件权限可能会出问题。
SANDBOX_USER_ID=$(id -u)
这个参数会让容器内的用户 ID 与你本地的保持一致,避免“权限不够”的尴尬。大多数系统上,这招都管用。
默认的 Docker 配置是为了方便本地开发设计的,就像一个敞开大门的实验室。但如果你在公共网络上(比如机场 WiFi)运行 OpenHands,这个“实验室”可能会暴露给不速之客。别担心,OpenHands 提供了一套“加固秘籍”,让你的 Docker 运行时变成一座固若金汤的堡垒。
默认情况下,OpenHands 会绑定到所有网络接口(0.0.0.0),这意味着任何能访问你设备的人都可能敲开它的门。为了安全起见,可以把它限制在本地:
0.0.0.0
SANDBOX_RUNTIME_BINDING_ADDRESS
docker run -it --rm \ -e SANDBOX_RUNTIME_BINDING_ADDRESS=127.0.0.1 \ -p 3000:3000 \ docker.all-hands.dev/all-hands-ai/openhands:0.31
这会让 OpenHands 只监听 127.0.0.1,也就是本地回环接口,外网完全无法触及。
127.0.0.1
-p
docker run -it --rm \ -p 127.0.0.1:3000:3000 \ docker.all-hands.dev/all-hands-ai/openhands:0.31
这样,即使有人扫描你的网络,也看不到 OpenHands 的影子。
如果还不放心,可以用 Docker 的网络功能给 OpenHands 建一个“私人小岛”:
# 创建一个隔离网络 docker network create openhands-network # 在隔离网络中运行 docker run -it --rm \ --network openhands-network \ -p 3000:3000 \ docker.all-hands.dev/all-hands-ai/openhands:0.31
这个 openhands-network 就像一个独立的小王国,OpenHands 在里面自给自足,与外界彻底隔绝。唯一的问题是,你需要额外的配置(比如端口转发)才能从主机访问它,但安全性大大提升。
openhands-network
不喜欢默认的 nikolaik 镜像?没问题,OpenHands 允许你自己动手打造运行时镜像。文档里提到,你可以基于基础镜像添加自己的工具和依赖。比如,想让 OpenHands 支持 Rust 开发?只需写一个 Dockerfile:
nikolaik
Dockerfile
FROM docker.all-hands.dev/all-hands-ai/runtime:0.31-nikolaik RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ENV PATH="/root/.cargo/bin:${PATH}"
构建并推送后,在运行时指定这个新镜像:
docker run -it --rm \ -e SANDBOX_RUNTIME_CONTAINER_IMAGE=your-custom-image \ -p 3000:3000 \ docker.all-hands.dev/all-hands-ai/openhands:0.31
这就像给魔法船加装了新引擎,想跑多快、装多少货,全由你决定。
OpenHands 的 Docker 运行时不仅是技术的基石,更是它灵活性和实用性的源泉。连接文件系统让 AI 从“云端助手”变成了“桌面伙伴”;加固配置则让它能在不安全的网络中放心使用;而自定义镜像则为开发者打开了无限可能。
就像 Docker 把软件打包成了便携的集装箱,OpenHands 用这些集装箱装下了 AI 的智慧。无论是修补一个 bug,还是从头搭建一个项目,它都能在几秒钟内起航,带你驶向代码的彼岸。未来,随着社区的不断完善,这个魔法容器可能会变得更聪明、更安全,甚至成为每个程序员工具箱里的标配。
要发表评论,您必须先登录。
在编程的世界里,Docker 早已不是什么新鲜玩意儿——它就像一个万能的魔法箱,能把复杂环境打包成便携的“胶囊”。然而,当这个魔法箱遇上 OpenHands 这个 AI 驱动的开发神器时,事情开始变得有趣起来。OpenHands 的默认运行时基于 Docker,不仅让 AI 开发者触手可及,还通过巧妙的设计赋予它连接本地文件系统、强化安全性的超能力。这篇文章将带你走进 OpenHands 的 Docker 运行时,看看它如何用一个容器改变软件开发的游戏规则。
🐳 Docker:AI 开发者的魔法船
想象一下,OpenHands 是一个全能的编程助手,能写代码、跑命令、修 bug,甚至还能上网找资料。要让这个“超级大脑”运转起来,Docker 就是它的魔法船。默认情况下,OpenHands 使用一个预构建的运行时镜像
docker.all-hands.dev/all-hands-ai/runtime:0.31-nikolaik
,里面装载了运行服务器和基础工具(比如 Python 和 NodeJS),就像一个装备齐全的移动工作站。启动它只需一行命令:
几秒钟后,你就能在
http://localhost:3000
看到 OpenHands 的身影。它就像一个漂浮在 Docker 海洋上的智能岛屿,随时待命为你服务。不过,这个岛屿的真正魔力,还在于它能与你的本地世界无缝连接。📂 打破壁垒:连接你的文件系统
OpenHands 不甘心只待在自己的容器里当个“孤岛”,它更想跳进你的代码库,和你并肩作战。要实现这一点,只需通过 Docker 的卷挂载功能,把本地文件系统“嫁接”到它的运行时中。操作起来就像给魔法船装上一个传送门:
步骤一:设定工作区根路径
首先,定义一个本地目录作为工作区,比如你的项目文件夹。用环境变量
WORKSPACE_BASE
来标记它:-v
参数就像一根魔法绳,把你的本地目录绑到了容器的/opt/workspace_base
上。从此,OpenHands 就能直接访问、修改你的代码文件,仿佛它就坐在你旁边敲键盘。小心“魔法失控”
不过,这种连接也有风险。文档里特别提醒:“没有什么能阻止 OpenHands 删除或修改挂载进工作区的文件。”这就像把家门钥匙交给一个勤快但偶尔毛手毛脚的机器人——它可能会把房间打扫得一尘不染,也可能不小心把你的收藏夹扔进垃圾桶。为了避免意外,建议先备份重要文件,或者用一个测试目录来“试水”。
还有个小细节:文件权限可能会出问题。
SANDBOX_USER_ID=$(id -u)
这个参数会让容器内的用户 ID 与你本地的保持一致,避免“权限不够”的尴尬。大多数系统上,这招都管用。
🔒 加固堡垒:打造安全的 Docker 运行时
默认的 Docker 配置是为了方便本地开发设计的,就像一个敞开大门的实验室。但如果你在公共网络上(比如机场 WiFi)运行 OpenHands,这个“实验室”可能会暴露给不速之客。别担心,OpenHands 提供了一套“加固秘籍”,让你的 Docker 运行时变成一座固若金汤的堡垒。
锁住网络大门
默认情况下,OpenHands 会绑定到所有网络接口(
0.0.0.0
),这意味着任何能访问你设备的人都可能敲开它的门。为了安全起见,可以把它限制在本地:SANDBOX_RUNTIME_BINDING_ADDRESS
:这会让 OpenHands 只监听
127.0.0.1
,也就是本地回环接口,外网完全无法触及。-p
参数,只绑定到本地地址:这样,即使有人扫描你的网络,也看不到 OpenHands 的影子。
隔离网络岛屿
如果还不放心,可以用 Docker 的网络功能给 OpenHands 建一个“私人小岛”:
这个
openhands-network
就像一个独立的小王国,OpenHands 在里面自给自足,与外界彻底隔绝。唯一的问题是,你需要额外的配置(比如端口转发)才能从主机访问它,但安全性大大提升。🛠 DIY 运行时:打造你的专属魔法箱
不喜欢默认的
nikolaik
镜像?没问题,OpenHands 允许你自己动手打造运行时镜像。文档里提到,你可以基于基础镜像添加自己的工具和依赖。比如,想让 OpenHands 支持 Rust 开发?只需写一个Dockerfile
:构建并推送后,在运行时指定这个新镜像:
这就像给魔法船加装了新引擎,想跑多快、装多少货,全由你决定。
🌟 从容器到未来:Docker 如何赋能 OpenHands
OpenHands 的 Docker 运行时不仅是技术的基石,更是它灵活性和实用性的源泉。连接文件系统让 AI 从“云端助手”变成了“桌面伙伴”;加固配置则让它能在不安全的网络中放心使用;而自定义镜像则为开发者打开了无限可能。
就像 Docker 把软件打包成了便携的集装箱,OpenHands 用这些集装箱装下了 AI 的智慧。无论是修补一个 bug,还是从头搭建一个项目,它都能在几秒钟内起航,带你驶向代码的彼岸。未来,随着社区的不断完善,这个魔法容器可能会变得更聪明、更安全,甚至成为每个程序员工具箱里的标配。
📚 参考文献