Docker容器运行Langchain/Langserve应用遇ModuleNotFoundError求助
问题描述
构建Langchain/Langserve应用时,本地通过langchain serve可正常运行,但使用Langserve生成的Dockerfile构建容器后,在AWS Margate运行出现错误:ModuleNotFoundError: No module named 'langchain'。此前相同Dockerfile本地构建可正常运行,现在本地重新构建也出现同样问题。
相关配置文件
Dockerfile
FROM python:3.11.5-bookworm ENV HOST=0.0.0.0 ENV LISTEN_PORT 8080 EXPOSE 8080 RUN apt-get update && apt-get install -y git RUN pip install poetry==1.6.1 RUN poetry config virtualenvs.create false WORKDIR /code COPY ./pyproject.toml ./README.md ./poetry.lock* ./ COPY ./packages ./packages RUN poetry install --no-interaction --no-ansi --no-root COPY ./app ./app RUN poetry install --no-interaction --no-ansi EXPOSE 8080 CMD exec uvicorn app.server:app --host 0.0.0.0 --port 8080
pyproject.toml
[tool.poetry] name = "pdfbot" version = "0.0.1" description = "" authors = [] readme = "README.md" [tool.poetry.dependencies] python = ">=3.8.1,<4.0" langchain-core = ">=0.1.5" langchain-openai = ">=0.0.1" huggingface-hub = "^0.20.3" pytest = "^8.0.0" pypdf = "^4.0.1" sentence-transformers = "^2.3.1" chromadb = "^0.4.22" [tool.poetry.group.dev.dependencies] langchain-cli = ">=0.0.4" fastapi = "^0.104.0" sse-starlette = "^1.6.5" [tool.langserve] export_module = "pdfbot" export_attr = "chain" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
poetry.lock中langchain相关条目
[[package]] name = "langchain" version = "0.1.5" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ {file = "langchain-0.1.5-py3-none-any.whl", hash = "sha256:4614118d4a95b2e7ba3611a0b6b21707a259a21652a04fbe3c31205bcf3fcd50"}, {file = "langchain-0.1.5.tar.gz", hash = "sha256:69603a5bb21b044ddea69d38131dbbf47475afdf79728644faa67d1ad325d652"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} dataclasses-json = ">=0.5.7,<0.7" jsonpatch = ">=1.33,<2.0" langchain-community = ">=0.0.17,<0.1" langchain-core = ">=0.1.16,<0.2" langsmith = ">=0.0.83,<0.1" numpy = ">=1,<2" pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0"
问题原因
- 依赖声明缺失:
pyproject.toml的依赖列表中没有显式声明langchain,仅包含langchain-core和langchain-openai。虽然poetry.lock中有langchain条目,但这是本地环境中手动/间接安装后生成的,容器构建时Poetry会严格根据pyproject.toml解析依赖——langchain-core是langchain的依赖,而非反向依赖,因此容器内不会自动安装langchain。 - 构建缓存或环境差异:之前本地构建正常可能是因为Docker缓存了包含
langchain的镜像层,重新安装Docker后缓存丢失,导致问题显现;GitLab构建环境无本地缓存,直接暴露了依赖缺失的问题。
解决步骤
1. 显式添加langchain依赖
编辑pyproject.toml,在[tool.poetry.dependencies]区块中添加langchain依赖:
[tool.poetry.dependencies] # 保留原有依赖,新增以下行 langchain = ">=0.1.5"
版本号可根据poetry.lock中的版本(0.1.5)指定,或使用兼容范围。
2. 更新poetry.lock(可选但推荐)
本地执行以下命令更新锁文件,确保依赖版本一致:
poetry lock --no-update
3. 调整Dockerfile构建步骤(可选,用于排查验证)
若想确认依赖是否安装成功,可在Dockerfile中添加验证步骤,比如在RUN poetry install --no-interaction --no-ansi后添加:
RUN poetry show langchain || pip list | grep langchain
这会在构建时输出langchain的安装信息,方便排查。
4. 重新构建并测试容器
执行Docker构建命令重新生成镜像,然后运行容器验证问题是否解决:
docker build -t pdfbot . docker run -p 8080:8080 pdfbot
额外说明
- 确保项目代码中确实依赖
langchain(而非仅langchain-core),若代码中未直接使用langchain,则需检查是否有间接依赖遗漏。 - Poetry的
--no-root参数会跳过安装当前项目,第一次poetry install --no-root仅安装项目依赖,第二次poetry install才安装项目本身,此步骤逻辑无误,但依赖缺失会导致运行时错误。
内容的提问来源于stack exchange,提问作者Lars UK
相关产品推荐
相关产品推荐

