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

Docker部署ClamAV服务的健康检查方法咨询

问题描述

我在AWS部署了基于clamav的Docker服务,对应的Dockerfile如下:

FROM alpine:3.14
LABEL maintainer="Markus Kosmal <code@m-ko.de>"

RUN apk add --no-cache bash clamav clamav-daemon clamav-libunrar

COPY conf /etc/clamav
COPY bootstrap.sh /
COPY envconfig.sh /
COPY check.sh /

RUN mkdir /var/run/clamav && \
    chown clamav:clamav /var/run/clamav && \
    chmod 750 /var/run/clamav && \
    chown -R clamav:clamav bootstrap.sh check.sh /etc/clamav && \
    chmod u+x bootstrap.sh check.sh 

EXPOSE 3310/tcp

USER clamav

CMD ["/bootstrap.sh"]

为了使用镜像服务,我用docker-compose做本地测试,配置文件如下:

version: "3.7"

services:
   mirror:
     build:
       context: .
       dockerfile: mirror/Dockerfile

     ports:
        - "8080:8080"

  clamav:
    build:
      context: ../clamav
    environment:
      CLAMAVDATABASEMIRROR: "http://0.0.0.0:8080"
    
    depends_on:
       - mirror
    ports:
     - "3310:3310"

服务运行正常,执行docker-compose up --build后日志显示正在拉取每日更新,docker container ls能看到clamav服务的3310/tcp端口,镜像服务的8080端口也能正常通过curl localhost:8080访问,但执行curl localhost:3310会返回curl: (52) Empty reply from server。

请问:如何对clamav服务执行健康检查?


解决方案

ClamAV的3310端口是TCP协议的clamd服务端口,并非HTTP服务,所以用curl访问会得到空回复是正常的。针对它的健康检查可以通过以下几种方式实现:

1. 使用ClamAV自带的clamdscan工具检查

容器内已预装clamdscan,可直接用它向本地clamd服务发送心跳请求验证状态:

方式一:修改Dockerfile添加健康检查

在Dockerfile的USER clamav语句后添加:

HEALTHCHECK --interval=30s --timeout=10s --start-period=2m \
  CMD clamdscan --ping -c /etc/clamav/clamd.conf || exit 1

方式二:在docker-compose中配置健康检查

无需修改Dockerfile,直接在clamav服务节点添加配置:

clamav:
  # 原有配置...
  healthcheck:
    test: ["CMD", "clamdscan", "--ping", "-c", "/etc/clamav/clamd.conf"]
    interval: 30s
    timeout: 10s
    start_period: 2m  # 预留病毒库更新的启动等待时间
    retries: 3

--ping参数会触发clamd的心跳响应,返回0表示服务正常,非0则判定为异常。

2. 直接检查TCP端口连通性

如果仅需验证端口可达性,无需检查服务逻辑,可使用nc(netcat)做TCP连通性检测:

docker-compose配置示例

clamav:
  # 原有配置...
  healthcheck:
    test: ["CMD", "nc", "-z", "localhost", "3310"]
    interval: 15s
    timeout: 5s
    start_period: 2m
    retries: 3

注意:若容器内无nc,需在Dockerfile的apk add命令中添加netcat-openbsd包。

3. 复用项目自带的check.sh脚本

你的Dockerfile已复制check.sh脚本,若该脚本已实现健康检查逻辑,可直接复用:

docker-compose配置示例

clamav:
  # 原有配置...
  healthcheck:
    test: ["CMD", "/check.sh"]
    interval: 30s
    timeout: 10s
    start_period: 2m

补充说明

  • start_period参数必须设置足够时长:ClamAV启动后需要下载更新病毒库,这段时间内服务无法正常响应请求,建议设置2分钟以上。
  • 在AWS部署时,可将上述健康检查逻辑同步配置到ECS/EKS任务定义,或EC2负载均衡的TCP健康检查规则中。

内容的提问来源于stack exchange,提问作者bruvio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:55:21