CentOS 7 Docker容器构建时初始化systemd安装ESET的问题
解决CentOS 7 Docker容器中高效安装运行ESET Endpoint Antivirus的方案
方案一:预构建含ESET的systemd支持镜像(推荐)
这是最高效的方案,一次性把ESET预安装到镜像里,后续启动容器直接用,不用每次重复安装耗时间。
1. 先做支持systemd的CentOS 7基础镜像
创建Dockerfile.systemd:
FROM centos:7 # 安装systemd和dbus(解决localectl依赖的总线问题) RUN yum -y update && \ yum -y install systemd dbus && \ yum clean all # 禁用systemd不必要的服务,减少容器资源占用 RUN systemctl mask tmp.mount systemd-logind.service getty.target # 告诉systemd当前是容器环境 ENV container docker # 容器启动命令设为systemd init CMD ["/usr/sbin/init"]
2. 构建基础镜像
docker build -t centos7-systemd -f Dockerfile.systemd .
3. 基于基础镜像安装ESET
创建Dockerfile.eset:
FROM centos7-systemd # 把本地的ESET安装包复制到容器内 COPY eea-9.1.4.0-el7.x86_64.rpm /tmp/ # 用dbus-launch模拟总线环境,直接在构建阶段完成安装 RUN dbus-launch rpm -i /tmp/eea-9.1.4.0-el7.x86_64.rpm && \ rm -f /tmp/eea-9.1.4.0-el7.x86_64.rpm
4. 构建最终的ESET镜像
docker build -t centos7-eset -f Dockerfile.eset .
5. 启动容器
启动时需要挂载cgroup目录,确保systemd正常运行:
docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro centos7-eset
方案二:修改ESET RPM包,移除systemd依赖
如果不想让容器依赖systemd,可以直接改掉RPM预安装脚本里的localectl调用:
1. 提取RPM的脚本内容
mkdir -p /tmp/eset-rpm && cd /tmp/eset-rpm # 提取预安装脚本到文件 rpm -qp --scripts /path/to/eea-9.1.4.0-el7.x86_64.rpm > rpm-scripts.txt
2. 修改预安装脚本
打开rpm-scripts.txt,找到包含localectl list-locales的行,把它删掉或者替换成空命令true。比如原脚本里的:
localectl list-locales > /dev/null 2>&1 || true
改成:
true
3. 重新打包RPM
用rpmrebuild工具修改并重打包:
rpmrebuild -e -p /path/to/eea-9.1.4.0-el7.x86_64.rpm
在弹出的编辑器里修改%pre段的脚本,保存后会生成一个新的修改版RPM包。
4. 在普通CentOS7容器中安装
现在可以直接用普通CentOS7镜像安装修改后的RPM,无需启动systemd:
FROM centos:7 COPY modified-eea-9.1.4.0-el7.x86_64.rpm /tmp/ RUN yum -y install /tmp/modified-eea-9.1.4.0-el7.x86_64.rpm && \ rm -f /tmp/modified-eea-9.1.4.0-el7.x86_64.rpm # 设置ESET启动命令 CMD ["/usr/bin/eset-endpoint-antivirus"]
方案三:临时容器安装后存为镜像(适合快速测试)
如果不想写复杂的Dockerfile,也可以先启动容器安装ESET,再把容器存成镜像:
1. 启动带systemd的临时容器
docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name eset-temp centos:7 /usr/sbin/init
2. 复制安装包到容器并安装
docker cp eea-9.1.4.0-el7.x86_64.rpm eset-temp:/tmp/ docker exec eset-temp rpm -i /tmp/eea-9.1.4.0-el7.x86_64.rpm
3. 保存为镜像
docker commit eset-temp centos7-eset docker rm -f eset-temp
之后直接用centos7-eset镜像启动容器即可。
内容的提问来源于stack exchange,提问作者eru
相关产品推荐
相关产品推荐

