在langgraph工作流中,Code节点扮演着至关重要的角色,它需要一个安全、隔离且高效的沙箱环境来执行Python代码。本文将详细介绍如何基于Docker技术,结合开源项目 Code-Interpreter-Api 搭建这样一个Python代码执行容器。
一、项目选择与准备
为实现Code节点的功能,我们选择了Code-Interpreter-Api这一开源项目作为参考。尽管该项目提供了完整的API服务和多种集成方案(如Docker、PostgreSQL等),但在此场景下,我们仅关注其Docker部署Python沙箱代码执行器的部分。因此,构建过程简化为仅需要三个核心文件:app.py、requirements.txt和Dockerfile。
- app.py:作为Docker容器内部提供API交互的程序文件,基于Flask框架开发,负责接收和执行用户提交的Python代码。
- requirements.txt:列出了Docker容器中需要安装的Python依赖库。你可以根据实际需求手动编辑此文件,或者利用项目中的
build.py脚本和config.yml配置文件动态生成。 - Dockerfile:该文件包含了构建本地Docker镜像的所有配置指令。在本文中,我们将展示一个经过修改,添加了清华源以提高依赖安装效率的Dockerfile示例。
二、Docker容器的构建与部署
1. 编写Dockerfile
首先,我们需要编写或修改Dockerfile,以便从正确的源(如清华源)拉取依赖,提高构建效率。以下是一个示例Dockerfile:
# 第一阶段:构建阶段
FROM python:3.10-slim AS builder
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装构建依赖
RUN apt-get update && apt-get install -y \
build-essential \
libssl-dev \
libffi-dev \
python3-dev \
&& apt-get clean \
&& pip install --no-cache-dir --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 第二阶段:运行阶段
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 从构建阶段复制必要的文件
COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY . .
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 暴露 Flask 端口
EXPOSE 5000
# 运行 Flask 应用
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
2. 准备其他文件
确保app.py和requirements.txt文件已经根据你的项目需求准备好。这些文件将被Docker在构建过程中复制到容器中。
3. 构建Docker镜像
在包含Dockerfile、app.py和requirements.txt的目录中,运行以下命令构建Docker镜像:
docker build -t code-interpreter-api .
这条命令会读取当前目录下的Dockerfile,并根据其中的指令构建一个名为code-interpreter-api的Docker镜像。
4. 运行Docker容器
构建完成后,通过以下命令启动Docker容器:
docker run -d -p 5000:5000 code-interpreter-api
这条命令会以后台模式启动一个容器,并将容器的5000端口映射到宿主机的5000端口上,使得你可以通过访问宿主机的5000端口来与Flask应用交互。
三、结语
通过上述步骤,我们成功搭建了一个可以在线执行Python代码的沙箱环境,并将其集成到langgraph工作流的Code节点中。这个容器环境不仅安全隔离,而且通过Docker的轻量级和可移植性,确保了在不同环境下的高效运行和灵活部署。未来,你可以根据需要进一步扩展和定制这个环境,以满足更复杂的应用场景。