You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器文件存在仍报NotFound及本地Redis连接拒绝问题

问题1:Cloud Run部署时配置文件File Not Found(已被list_files列出)

可能原因

  • 文件权限不足:镜像中配置文件的权限设置导致Cloud Run运行进程无读取权限,部分场景下权限错误会被抛出为FileNotFoundError。
  • 路径大小写不匹配:Linux文件系统大小写敏感,确认path参数的文件名、路径大小写与实际文件完全一致。
  • 错误类型被混淆:代码未捕获具体异常,实际可能是PermissionError而非FileNotFoundError。

排查与解决步骤

  1. 添加文件权限设置:在Dockerfile中添加权限修改命令,确保运行用户可读取配置文件:
    RUN chmod 644 /etc/rapport_engine/agent.conf.yaml
    
  2. 打印文件权限详情:修改list_files函数,输出文件权限信息,验证当前用户是否有读取权限:
    def list_files(directory):
        for file in pathlib.Path(directory).rglob('*'):
            if file.is_file():
                print(f"文件路径: {file}, 权限: {oct(file.stat().st_mode)[-3:]}")
    
  3. 捕获具体异常:修改load函数,捕获并打印详细错误信息,明确异常类型:
    def load(path: str) -> AgentConfiguration:
        list_files('/etc/rapport_engine')
        try:
            with open(path, "r") as f:
                contents = yaml.safe_load(f)
            return AgentConfiguration(contents)
        except OSError as e:
            print(f"打开文件错误: {e}, 错误类型: {type(e).__name__}")
            raise
    
  4. 验证镜像构建逻辑:检查Dockerfile中COPY命令是否正确将配置文件复制到目标路径,例如:
    COPY agent.conf.yaml /etc/rapport_engine/
    

问题2:本地Docker容器连接Redis时出现Connection refused

原因

Redis容器端口绑定为127.0.0.1:6379->6379/tcp,仅允许主机本地访问;应用容器的127.0.0.1指向自身容器内部,无法访问主机的Redis服务。

解决方法

方法1:使用Docker共享网络

将应用容器与Redis容器加入同一Docker网络,通过容器名称访问Redis:

  1. 查看Redis容器所在网络(若未指定,默认是bridge网络):
    docker inspect cantegrilforeverbot_redis_1 | grep NetworkMode
    
  2. 运行应用容器时指定同一网络:
    docker run --env-file .env --network=bridge 15533b9c737e -c /etc/rapport_engine/agent.conf.yaml
    
  3. 修改应用配置中的Redis地址为容器名称:cantegrilforeverbot_redis_1:6379

方法2:修改Redis端口绑定

允许Redis接受外部容器访问,使用主机IP访问:

  1. 重启Redis容器,修改端口绑定为0.0.0.0:6379->6379/tcp:
    docker run -d -p 0.0.0.0:6379:6379 --name cantegrilforeverbot_redis_1 redis:7-alpine
    
  2. 应用配置中使用主机IP(或host.docker.internal,适用于Docker Desktop)作为Redis地址:host.docker.internal:6379

方法3:使用主机网络运行应用容器

让应用容器共享主机网络栈,直接访问127.0.0.1:6379:

docker run --env-file .env --network=host 15533b9c737e -c /etc/rapport_engine/agent.conf.yaml

注:该方式会让应用容器共享主机网络,安全性较低,仅用于本地测试。


内容的提问来源于stack exchange,提问作者Mauricio Porto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:15:07