【问题标题】:Dockerfile: bind9: unrecognized service [duplicate]Dockerfile:bind9:无法识别的服务[重复]
【发布时间】:2021-10-21 13:09:10
【问题描述】:

我是 docker 新手,我想用 Ubuntu 20.04 和 bind9 服务安装构建镜像。

下面是我的docker文件代码

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 \
    apt-utils \
    systemctl \
    bind9     

CMD ["/usr/sbin/named", "-g", "-c", "/etc/bind/named.conf", "-u", "bind"]

CMD systemctl restart bind9

当我执行以下命令构建图像时,

sudo docker image build --tag bind9server . 

效果很好。

Step 6/6 : CMD systemctl restart bind9
 ---> Running in f982f314c216

但是当我运行这个 docker 镜像时,我收到如下错误

ERROR:systemctl:Unit bind9.service could not be found.

谁能帮助我,安装 Bind9 后,为什么上面的命令会出错?

错误仅与 Docker 一起出现,如果我在 Ubuntu 20.04 的主机环境中运行相同的命令,那么它可以正常工作。

【问题讨论】:

  • 尝试在 Docker 中运行 systemd 比这复杂得多。您可能需要找到一种不同的方法来解决您的问题。
  • 第二个CMD 覆盖第一个;无论如何,你只能拥有一个。
  • 第一个近似值 systemctl(以及类似的命令,如 service/etc/init.d 脚本)在 Docker 中不起作用;但是如果你删除第二个CMD,第一个会在前台启动named作为单个主容器进程吗?

标签: docker shell ubuntu


【解决方案1】:

第一件事:你应该为你的最后一个 CMD 使用一个长时间运行的命令,否则容器将在完成后退出。 CMD 的目的是为您的容器提供默认入口点,因此即使有 bind9 服务,您的容器也会立即退出。此外,只有最后一个 CMD 生效(请参阅docs)。

第二:请参阅this question,了解为什么在 Docker 容器中使用systemd 运行不是一个好主意。第一次尝试会好很多,直接调用named

第三:在“正常”主机上,当您不确定单元名称如bind9 时,您可以尝试使用systemctl list-units --all 检查所有已知单元。看起来您的服务名为 named

【讨论】:

  • 嗨@Ostap,首先非常感谢你的回答,长期以来,是的,我也安装了tcpdump,它正在监听,所以它可以连续工作......
  • 很高兴能提供帮助 :-) 如果这将是生产服务,请考虑运行 tcpdump 的开销。祝您度过愉快的一周,如果可以解决您的问题,请考虑 accepting the answer
  • 我已经为您的解决方案投票赞成您的回答,但我想根据要求进行设置,所以想知道是否还有
猜你喜欢
  • 2020-04-16
  • 2023-03-24
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 2016-02-10
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多