Node.js中使用clamscan报错求助(附Docker部署配置)
问题
我希望在Node.js中使用clamscan工具,为此通过Dockerfile部署clamav相关组件,以下是我的Dockerfile代码:
#Define the image we want to build from FROM node:16.19.1-alpine3.17 #Copy the current directory to a newly created working directory COPY --chown=1000 . /code #Define the working directory - Change this to the directory your Node app is defined in WORKDIR /code/server RUN apk update && apk upgrade RUN npm install --quiet node-gyp -g # Run image as root user USER root RUN apk --no-cache add clamav clamav-daemon freshclam clamav-libunrar supervisor RUN sed -i 's/^Foreground .*$/Foreground true/g' /etc/clamav/clamd.conf && \ echo 'TCPSocket 3310' >> /etc/clamav/clamd.conf && \ sed -i 's/^Foreground .*$/Foreground true/g' /etc/clamav/freshclam.conf RUN freshclam RUN mkdir /run/clamav && chown clamav:clamav /run/clamav EXPOSE 3310/tcp # Run image as non-root user USER node RUN npm rebuild #This app binds to the below specified port, so we use the EXPOSE instruction to have it mapped by the docker daemon EXPOSE 11012 # Run image as non-root user USER node # Run application CMD [ "node", "server.js"]
但当我在Node.js应用中调用clamscan.isInfected(localFullPath)方法时,出现执行以下命令的错误:
/usr/bin/clamdscan --no-summary --fdpass --multiscan /code/server/attachments/image.jpeg
解决步骤
确保clamav服务随容器启动
当前Dockerfile仅启动了Node.js服务,clamd(clamav守护进程)并未启动。可通过启动脚本实现多进程管理:- 创建
start.sh启动脚本:#!/bin/sh # 后台启动clamd服务 clamd & # 等待服务初始化完成(可根据实际情况调整等待时间) sleep 5 # 启动Node.js应用 node server.js - 在Dockerfile中添加脚本相关配置:
# 复制启动脚本到容器工作目录 COPY start.sh /code/server/start.sh # 赋予脚本执行权限 RUN chmod +x /code/server/start.sh # 修改启动命令为执行脚本 CMD ["./start.sh"]
- 创建
修复权限访问问题
- 将node用户加入clamav用户组,确保能访问clamav的socket资源:
# 在切换到node用户前(USER root阶段)执行 RUN usermod -aG clamav node - 调整附件目录权限,确保clamav进程能读取待扫描文件:
# 设置目录权限允许其他用户读取 RUN chmod -R 755 /code/server/attachments # 或者将目录所属组改为clamav RUN chown -R node:clamav /code/server/attachments
- 将node用户加入clamav用户组,确保能访问clamav的socket资源:
配置clamscan客户端连接参数
在Node.js代码中明确指定clamd服务的连接信息,确保客户端能正确对接守护进程:const ClamScan = require('clamscan'); const scanner = new ClamScan({ clamdscan: { host: '127.0.0.1', port: 3310, // 匹配Dockerfile中配置的TCPSocket端口 timeout: 60000 // 根据文件大小调整超时时间 } }); // 初始化扫描器后执行扫描 scanner.init().then(async (clam) => { const scanResult = await clam.isInfected('/code/server/attachments/image.jpeg'); // 处理扫描结果 }).catch(err => { console.error('扫描器初始化失败:', err); });验证clamav服务状态
容器启动后,可进入容器检查clamd是否正常运行:docker exec -it <容器ID> ps aux | grep clamd若服务未启动,可手动执行
clamd命令查看具体报错信息,排查配置问题。
内容的提问来源于stack exchange,提问作者Gopalakrishnan M
相关产品推荐
相关产品推荐

