Greenbone社区版Docker脚本无法连接GVMD Unix套接字求助
解决Greenbone脚本容器无法连接gvmd套接字的问题
核心问题分析
从日志和现象来看,虽然套接字文件存在且权限开放,但连接被拒绝,大概率是gvmd进程未正常监听套接字,根源是gvmd日志里的pidfile_create: failed to open pidfile /run/gvmd/gvmd.pid: Permission denied错误,导致gvmd初始化不完整。
解决方案
1. 修复gvmd的pidfile权限问题
gvmd无法创建pid文件会导致进程未完全启动,无法监听套接字。调整gvmd容器的配置,确保/run/gvmd目录权限匹配gvmd运行用户:
# 在docker-compose的gvmd服务中添加配置 gvmd: # 其他原有配置... user: "1001:1001" # 与套接字文件的所有者一致 volumes: - gvmd_socket_vol:/run/gvmd # 或者通过启动命令先修复目录权限 command: > sh -c "chown -R 1001:1001 /run/gvmd && exec gvmd --foreground"
2. 确保脚本容器与gvmd的用户权限匹配
脚本容器的运行用户需要能正常访问套接字:
- 查看脚本容器的运行用户:
docker compose -f ./openvas-docker-compose.yml -p greenbone-community-edition exec script id - 如果是非root用户,修改脚本容器的Dockerfile或docker-compose配置,切换到与套接字所有者一致的用户:
或者直接在docker-compose中指定用户:# 在脚本容器的Dockerfile中添加 RUN useradd -u 1001 gvmuser USER gvmuserscript: # 其他原有配置... user: "1001:1001"
3. 验证gvmd是否正常监听套接字
进入gvmd容器,检查是否有进程监听目标套接字:
docker compose -f ./openvas-docker-compose.yml -p greenbone-community-edition exec gvmd netstat -lx | grep gvmd.sock
如果无输出,说明gvmd未正常启动,优先解决pidfile权限问题;如果有输出,再排查脚本容器的连接逻辑。
4. 添加健康检查确保gvmd就绪后启动脚本容器
depends_on仅保证容器启动顺序,不保证服务就绪。添加健康检查让脚本容器等待gvmd完全启动:
# gvmd服务添加健康检查 gvmd: # 其他原有配置... healthcheck: test: ["CMD-SHELL", "netstat -lx | grep gvmd.sock || exit 1"] interval: 10s timeout: 5s retries: 5 # 脚本容器修改depends_on script: # 其他原有配置... depends_on: gvmd: condition: service_healthy
5. 临时替换命名卷为主机绑定挂载(验证用)
如果上述方案仍未解决,可暂时用主机绑定挂载替代命名卷(你之前验证过此方式有效),确认问题是否出在命名卷的权限或配置上:
script: volumes: - /tmp/run/gvm/gvmd.sock:/run/gvmd/gvmd.sock # 替代原命名卷
内容的提问来源于stack exchange,提问作者TeemSy
相关产品推荐
相关产品推荐

