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

