Docker容器文件存在仍报NotFound及本地Redis连接拒绝问题
问题1:Cloud Run部署时配置文件File Not Found(已被list_files列出)
可能原因
- 文件权限不足:镜像中配置文件的权限设置导致Cloud Run运行进程无读取权限,部分场景下权限错误会被抛出为FileNotFoundError。
- 路径大小写不匹配:Linux文件系统大小写敏感,确认
path参数的文件名、路径大小写与实际文件完全一致。 - 错误类型被混淆:代码未捕获具体异常,实际可能是PermissionError而非FileNotFoundError。
排查与解决步骤
- 添加文件权限设置:在Dockerfile中添加权限修改命令,确保运行用户可读取配置文件:
RUN chmod 644 /etc/rapport_engine/agent.conf.yaml - 打印文件权限详情:修改
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:]}") - 捕获具体异常:修改
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 - 验证镜像构建逻辑:检查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:
- 查看Redis容器所在网络(若未指定,默认是bridge网络):
docker inspect cantegrilforeverbot_redis_1 | grep NetworkMode - 运行应用容器时指定同一网络:
docker run --env-file .env --network=bridge 15533b9c737e -c /etc/rapport_engine/agent.conf.yaml - 修改应用配置中的Redis地址为容器名称:
cantegrilforeverbot_redis_1:6379
方法2:修改Redis端口绑定
允许Redis接受外部容器访问,使用主机IP访问:
- 重启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 - 应用配置中使用主机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
相关产品推荐
相关产品推荐

