Docker部署LibreTranslate到Heroku遇R10启动超时错误求助
问题
尝试用Docker将基于Python Flask的LibreTranslate应用部署到Heroku时,持续遇到启动超时错误。本地Docker运行完全正常,但部署到Heroku后,应用无法在60秒内绑定到指定端口,触发R10错误。
Heroku错误日志
2024-06-22T01:11:17.161226+00:00 heroku[web.1]: Starting process with command `/bin/sh -c /app/run.sh` 2024-06-22T01:11:17.801391+00:00 app[web.1]: Starting LibreTranslate... 2024-06-22T01:11:17.801440+00:00 app[web.1]: PORT: 59962 2024-06-22T01:11:17.801441+00:00 app[web.1]: Using port: 59962 2024-06-22T01:12:17.387183+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch 2024-06-22T01:12:17.399589+00:00 heroku[web.1]: Stopping process with SIGKILL 2024-06-22T01:12:17.487780+00:00 heroku[web.1]: Process exited with status 137
Dockerfile
FROM python:3.11.9-slim-bullseye as builder WORKDIR /app ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -qq \ && apt-get -qqq install --no-install-recommends -y pkg-config gcc g++ \ && apt-get upgrade --assume-yes \ && apt-get clean \ && rm -rf /var/lib/apt RUN python -m venv venv && ./venv/bin/pip install --no-cache-dir --upgrade pip COPY . . # Install package from source code, compile translations RUN ./venv/bin/pip install Babel==2.12.1 && ./venv/bin/python scripts/compile_locales.py \ && ./venv/bin/pip install torch==2.0.1 --extra-index-url https://download.pytorch.org/whl/cpu \ && ./venv/bin/pip install . \ && ./venv/bin/pip cache purge FROM python:3.11.9-slim-bullseye ARG with_models=false ARG models="" RUN addgroup --system --gid 1032 libretranslate && adduser --system --uid 1032 libretranslate && mkdir -p /home/libretranslate/.local && chown -R libretranslate:libretranslate /home/libretranslate/.local USER libretranslate COPY --from=builder --chown=1032:1032 /app /app WORKDIR /app COPY --from=builder --chown=1032:1032 /app/venv/bin/ltmanage /usr/bin/ RUN if [ "$with_models" = "true" ]; then \ # initialize the language models if [ ! -z "$models" ]; then \ ./venv/bin/python scripts/install_models.py --load_only_lang_codes "$models"; \ else \ ./venv/bin/python scripts/install_models.py; \ fi \ fi # Set the ENTRYPOINT to ensure that the run.sh script is executed with the correct interpreter ENTRYPOINT ["/bin/bash", "/app/run.sh"]
run.sh
#!/bin/bash set -eo pipefail echo "Starting LibreTranslate..." echo "PORT: ${PORT}" ./venv/bin/libretranslate --host 0.0.0.0 --port $PORT &> /app/libretranslate.log 2>&1
咨询问题
- 绑定到0.0.0.0在Heroku环境中是否不正确?
- 如何进一步排查应用无法在规定时间内绑定端口的原因?
- Flask或Docker配置是否存在已知问题会导致端口绑定延迟?
解答
1. 绑定到0.0.0.0在Heroku环境中是否不正确?
绑定到0.0.0.0是完全正确的。Heroku容器环境要求应用监听所有网络接口,不能仅绑定本地回环地址(127.0.0.1),否则Heroku的路由层无法访问应用端口。这部分你的配置没有问题。
2. 如何进一步排查应用无法在规定时间内绑定端口的原因?
- 调整日志输出方式:当前
run.sh将所有日志重定向到本地文件,Heroku无法直接获取这些内容。修改启动命令,把日志直接输出到标准输出/错误流,这样就能在Heroku日志中看到LibreTranslate启动的详细过程,比如是否卡在模型加载环节,或者Flask启动是否有报错:# 修改run.sh中的启动命令 ./venv/bin/libretranslate --host 0.0.0.0 --port $PORT - 确认模型加载时机:如果Docker构建时未设置
with_models=true,应用启动时会自动下载模型,这一步在Heroku受限环境中很容易超过60秒。检查部署时是否指定了该参数,或是否限定了加载的模型数量,避免启动时动态下载。 - 本地模拟Heroku环境测试:在本地设置
PORT环境变量,用Docker运行容器,记录启动耗时,同时观察输出,定位是否有耗时过长的步骤。 - 检查资源限制:Heroku免费/基础容器的CPU、内存资源有限,LibreTranslate加载大模型时可能因资源不足导致启动缓慢。可以尝试升级容器规格,或减少加载的模型数量。
3. Flask或Docker配置是否存在已知问题会导致端口绑定延迟?
- 模型加载耗时是核心原因:Flask本身启动速度很快,但LibreTranslate在启动Flask前需要加载Torch机器学习模型,这是最可能导致超时的环节——模型加载通常需要大量时间和资源,在Heroku受限环境中容易超过60秒。
- Docker构建阶段未预加载模型:如果构建时
with_models=false,应用启动时会自动下载并加载模型,这一步的耗时极易触发超时。 - 权限与路径问题:虽然日志显示端口已被识别,但仍需确认
libretranslate用户是否有足够权限访问模型文件和执行./venv/bin/libretranslate命令,可临时用root用户测试排除权限问题。
内容的提问来源于stack exchange,提问作者Bassel
相关产品推荐
相关产品推荐

