在docker中启动superset,开启生成缩略图,容器中配置的redis也成功启动了,但是还是报错Traceback (most recent call last): superset_app | File "/app/.venv/lib/python3.11/site-packages/flask_appbuilder/api/__init__.py", line 111, in wraps superset_app | return f(self, *args, **kwargs) superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/superset/views/base_api.py", line 120, in wraps superset_app | duration, response = time_function(f, self, *args, **kwargs) superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/superset/utils/core.py", line 1363, in time_function superset_app | response = func(*args, **kwargs) superset_app | ^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/superset/utils/log.py", line 303, in wrapper superset_app | value = f(*args, **kwargs) superset_app | ^^^^^^^^^^^^^^^^^^ superset_app | File "/app/superset/charts/api.py", line 750, in thumbnail superset_app | screenshot_obj.get_from_cache_key(cache_key) or ScreenshotCachePayload() superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/superset/utils/screenshots.py", line 206, in get_from_cache_key superset_app | if payload := cls.cache.get(cache_key): superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/.venv/lib/python3.11/site-packages/flask_caching/__init__.py", line 195, in get superset_app | return self.cache.get(*args, **kwargs) superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/.venv/lib/python3.11/site-packages/cachelib/redis.py", line 72, in get superset_app | return self.serializer.loads(self._read_client.get(self.key_prefix + key)) superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/.venv/lib/python3.11/site-packages/redis/commands/core.py", line 1816, in get superset_app | return self.execute_command("GET", name) superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/.venv/lib/python3.11/site-packages/redis/client.py", line 1266, in execute_command superset_app | conn = self.connection or pool.get_connection(command_name, **options) superset_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ superset_app | File "/app/.venv/lib/python3.11/site-packages/redis/connection.py", line 1461, in get_connection superset_app | connection.connect() superset_app | File "/app/.venv/lib/python3.11/site-packages/redis/connection.py", line 713, in connect superset_app | raise ConnectionError(self._error_message(e)) superset_app | redis.exceptions.ConnectionError: Error 111 connecting to localhost:6379. Connection refused. superset_app | 172.20.0.1 - - [26/Mar/2025:10:40:59 +0000] "GET /api/v1/chart/53/thumbnail/33abcd9ad6c3752ac558350cb4dfe056/ HTTP/1.1" 500 31 "http://127.0.0.1:8088/superset/welcome/" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" superset_app | 2025-03-26 10:40:59,222:ERROR:flask_appbuilder.api:Error 111 connecting to localhost:6379. Connection refused.
时间: 2025-04-12 16:37:52 浏览: 47
<think>好的,我现在需要帮助用户解决在Docker中启动Superset时遇到的缩略图生成问题,尽管Redis已经启动,但依然报错连接被拒绝。首先,我需要仔细分析用户提供的错误日志。
错误信息显示,Superset在尝试连接到Redis时遇到了问题,具体是连接到localhost:6379被拒绝。这可能意味着虽然Redis容器已经运行,但Superset配置中的Redis连接地址不正确,或者网络配置有问题,导致无法正确访问Redis服务。
首先,用户提到在容器中配置了Redis并且成功启动,但可能Redis没有正确暴露端口,或者Superset容器无法通过localhost访问Redis。在Docker环境中,每个容器默认有自己的网络,因此如果Superset和Redis运行在同一个Docker网络中,需要使用容器名称作为主机名,而不是localhost。例如,如果Redis容器名为redis,那么连接地址应该是redis:6379,而不是localhost:6379。
接下来,我需要检查用户的Docker Compose文件配置是否正确。确保Redis服务已经正确定义,并且Superset服务依赖于Redis。此外,需要确认Superset的环境变量是否正确设置了Redis的URL,比如SUPERSET_CACHE_CONFIG中的CACHE_REDIS_URL应该指向Redis容器的地址。
另外,Redis容器是否配置了正确的端口映射?如果Redis只在容器内部监听6379端口,而宿主机没有映射端口,或者Superset容器没有连接到同一个Docker网络,也会导致连接失败。用户需要确保两个容器在同一个网络中,并且Superset使用Redis容器的服务名进行连接。
此外,可能还需要检查Redis的配置文件是否允许外部连接,比如bind 0.0.0.0,以及是否禁用了保护模式。如果Redis容器配置了密码,Superset的环境变量中也需要包含密码信息。
最后,建议用户验证Redis是否真的在运行,并且能够从Superset容器内部访问。可以通过进入Superset容器执行telnet或redis-cli命令测试连接性。如果连接失败,说明网络或配置有问题,需要调整Docker网络设置或Redis配置。
总结可能的问题点:Redis连接地址配置错误、Docker网络配置问题、Redis服务未正确启动或配置。需要逐一排查这些方面,确保所有配置正确,容器间网络互通。</think>在Docker中启动Superset时遇到Redis连接拒绝错误,需按以下步骤排查和解决:
---
### 一、核心问题诊断
错误日志显示关键信息:
```log
redis.exceptions.ConnectionError: Error 111 connecting to localhost:6379. Connection refused.
```
表明**Superset容器试图通过`localhost:6379`访问Redis失败**,常见原因:
1. Redis容器未正确暴露端口
2. 容器间网络未互通
3. Superset配置中Redis地址指向错误
---
### 二、逐步解决方案
#### 1. 确保Docker网络配置正确
在`docker-compose.yml`中需满足:
```yaml
services:
superset_app:
networks:
- superset_network # 必须与redis共享网络
depends_on:
- redis
redis:
image: redis:latest
ports:
- "6379:6379" # 确保端口映射
networks:
- superset_network
networks:
superset_network:
driver: bridge
```
* 如果未共享网络,容器间需通过容器名称(而非`localhost`)通信
---
#### 2. 修正Superset的Redis配置
在Superset的环境变量中配置:
```env
# 使用Docker服务名作为Redis主机名
SUPERSET_CACHE_CONFIG='{"CACHE_TYPE":"RedisCache","CACHE_REDIS_URL":"redis://redis:6379/0"}'
```
* 若Redis有密码,需添加`?password=your_password`
* 若使用独立Redis实例,替换`redis://`后的地址为实际IP/域名
---
#### 3. 验证Redis容器连通性
进入Superset容器执行测试:
```bash
docker exec -it superset_app bash
apt update && apt install -y telnet # 安装工具
telnet redis 6379 # 应返回"Connected to redis"
```
* 若连接失败,检查Redis容器日志:`docker logs redis`
---
#### 4. 检查Redis配置
确保Redis容器启动时允许外部连接:
```bash
# 在docker-compose.yml中为redis添加配置
command: redis-server --bind 0.0.0.0 --protected-mode no
```
* `--bind 0.0.0.0`允许所有IP连接
* `--protected-mode no`关闭保护模式
---
### 三、完整配置示例
```yaml
version: '3'
services:
redis:
image: redis:7.0
command: redis-server --bind 0.0.0.0 --protected-mode no
ports:
- "6379:6379"
networks:
- superset_net
superset_app:
image: apache/superset:latest
environment:
- SUPERSET_CACHE_CONFIG={"CACHE_TYPE":"RedisCache","CACHE_REDIS_URL":"redis://redis:6379/0"}
ports:
- "8088:8088"
networks:
- superset_net
depends_on:
- redis
networks:
superset_net:
driver: bridge
```
---
### 四、附加调试建议
1. 清除Superset缓存:重启后执行`docker-compose down -v`
2. 检查缩略图配置:
```env
# 确保启用异步任务
SUPERSET_FEATURE_ALERT_REPORTS = True
SUPERSET_ENABLE_THUMBNAILS = True
```
3. 查看完整错误日志:`docker-compose logs --tail=100 superset_app redis`
通过以上步骤,95%的Redis连接问题可被解决。若仍有问题,需检查宿主机防火墙或云服务商的安全组设置。
阅读全文
相关推荐











