Docker构建Ubuntu20.04 bind9镜像运行报bind9.service未找到如何解决
报错原因
- Dockerfile 中存在两条
CMD指令,Docker 仅会执行最后一条CMD,你前面编写的直接启动 bind9 进程的指令被后续的systemctl restart bind9覆盖,不会生效。 - 默认 Docker 容器不会启动 systemd 初始化系统,
systemctl依赖运行中的 systemd 进程才能读取注册的服务单元。容器环境下没有 systemd 运行实例,哪怕你安装了 bind9 包,对应的bind9.service单元也没有被加载,所以systemctl会提示找不到服务。而你的宿主机有完整的 systemd 运行环境,因此执行同一条命令不会报错。 - 额外说明:你安装的
systemctl包本身只是 systemd 的管理工具,本身不会自动启动 systemd 守护进程。
解决方案
推荐使用符合 Docker 最佳实践的「单前台进程」方案,无需依赖 systemd,配置更简单、镜像体积更小:
- 修改 Dockerfile 内容如下,删除冗余的
systemctl安装和第二条CMD指令:
FROM ubuntu:20.04 ENV TZ=Asia RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt-get update && apt-get install -y --no-install-recommends \ apt-utils \ bind9 && \ rm -rf /var/lib/apt/lists/* CMD ["/usr/sbin/named", "-g", "-c", "/etc/bind/named.conf", "-u", "bind"]
新增的
--no-install-recommends和rm -rf /var/lib/apt/lists/*是为了减小构建后的镜像体积,非必须操作。
- 重新执行构建命令即可:
sudo docker image build --tag bind9server .
- 运行容器时直接映射对应端口即可正常使用 bind9 服务:
sudo docker run -d -p 53:53/udp -p 53:53/tcp bind9server
如果确实需要在容器中使用 systemd 管理服务(不推荐,违背容器设计原则),你需要额外调整容器运行参数:
- Dockerfile 中保留 systemd 相关配置,启动容器时添加
--privileged参数,同时挂载宿主机的/sys/fs/cgroup目录到容器内,确保 systemd 可以正常启动。
内容的提问来源于stack exchange,提问作者Siddhpura Amit
相关产品推荐
相关产品推荐

