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

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,配置更简单、镜像体积更小:

  1. 修改 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/* 是为了减小构建后的镜像体积,非必须操作。

  1. 重新执行构建命令即可:
sudo docker image build --tag bind9server . 
  1. 运行容器时直接映射对应端口即可正常使用 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:24:05