Docker部署Dash应用报postgres主机名无法解析问题排查
错误产生原因
这个报错和postgres服务本身的配置无关,不需要调整postgres相关配置项,核心原因是Docker网络隔离:
- 你当前是通过独立的
docker run命令启动Dash应用容器,这个容器默认接入Docker的默认bridge网络,和docker-compose创建的服务网络完全隔离 - docker-compose中配置的
postgres主机名是Docker内置DNS为同一compose网络内容器提供的服务发现域名,只有加入该compose网络的容器才能解析这个域名,你单独启动的容器不在这个网络里,自然无法将postgres解析为对应IP,就会抛出找不到主机的错误 - 额外注意:你原有Dockerfile里的gunicorn启动路径也有问题,从compose的卷挂载配置看,py_scripts目录在容器内的路径是
/opt/airflow/py_scripts,直接写/py_scripts.index:server会触发模块找不到的错误。
修复方案
推荐直接把Dash应用作为服务加入现有docker-compose配置,不需要单独执行docker run启动,步骤如下:
- 在docker-compose.yaml的
services块下新增dash-app服务配置,直接复用已有的airflow公共配置,保证环境变量、卷挂载、网络、服务依赖都和其他airflow组件一致:
dash-app: <<: *airflow-common command: gunicorn -b 0.0.0.0:8050 /opt/airflow/py_scripts.index:server ports: - 8050:8050 restart: always
- 调整你的Dockerfile,不需要在Dockerfile里写死CMD,因为compose里已经配置了启动命令,Dockerfile保留基础镜像配置即可:
FROM airflow-update
- 重新启动compose栈即可:
docker-compose up -d,启动后dash-app服务和postgres在同一个网络内,可正常解析postgres主机名连接数据库。
如果你坚持要用单独的docker run命令启动,需要先查询compose创建的默认网络名(一般格式为[compose文件所在文件夹名]_default,可通过docker network ls查看),启动时指定接入该网络,同时补全所有必要的环境变量和卷挂载,操作繁琐容易漏配置,不推荐使用。
内容的提问来源于stack exchange,提问作者Serda Shehu
相关产品推荐
相关产品推荐

