You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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守护进程)并未启动。可通过启动脚本实现多进程管理:

    1. 创建start.sh启动脚本:
      #!/bin/sh
      # 后台启动clamd服务
      clamd &
      # 等待服务初始化完成(可根据实际情况调整等待时间)
      sleep 5
      # 启动Node.js应用
      node server.js
      
    2. 在Dockerfile中添加脚本相关配置:
      # 复制启动脚本到容器工作目录
      COPY start.sh /code/server/start.sh
      # 赋予脚本执行权限
      RUN chmod +x /code/server/start.sh
      # 修改启动命令为执行脚本
      CMD ["./start.sh"]
      
  • 修复权限访问问题

    1. 将node用户加入clamav用户组,确保能访问clamav的socket资源:
      # 在切换到node用户前(USER root阶段)执行
      RUN usermod -aG clamav node
      
    2. 调整附件目录权限,确保clamav进程能读取待扫描文件:
      # 设置目录权限允许其他用户读取
      RUN chmod -R 755 /code/server/attachments
      # 或者将目录所属组改为clamav
      RUN chown -R node:clamav /code/server/attachments
      
  • 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:52:50