当主机OS是Ubuntu 16.04或RHEL 7.x时,下面的命令正在工作,帮助我们从码头容器中在主机上运行systemctl命令:
# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl start dummy.service但是在较新的主机OS-es、Ubuntu20.04和RHEL8.x中,这不起作用,我们得到以下错误:
# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl start dummy.service
Failed to connect to bus: No data available我附上了一个极简的例子和命令来运行和复制这个问题:
我想在主机上从容器中启动的示例服务:
# cat /etc/systemd/system/dummy.service
[Unit]
Description=dummy service
[Service]
ExecStart=/usr/bin/sleep infinity我的容器的Dockerfile:
# cat Dockerfile
FROM ubuntu:20.04
ENV TZ=UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt update -y --fix-missing
RUN apt install -y util-linux
STOPSIGNAL SIGRTMIN+3
CMD [ "/bin/bash" ]建立形象:
# docker build -t trial .删除任何陈旧的容器:
# docker rm -f trial运行图像:
# docker run -it -d --net=host --privileged -v /:/hostroot -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name trial trial转载本议题:
# docker exec -it trial bash
# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl start dummy.service
Failed to connect to bus: No data available我想知道是否有任何额外的选项或任何码头运行命令需要修改,以使这一工作。
发布于 2022-01-11 16:37:47
我对此进行了几个小时的研究,似乎对标清_公共汽车_开始方法进行了更改,以包括其他检查。我无法缩小它正在寻找的其他内容,但是我想出了一个更优雅的解决方案,使用远程systemctl命令来完成相同的任务,而不是从主机挂载所有目录。
systemctl通过--host / -H标志支持远程命令。它使用ssh连接到远程主机,因此需要一个ssh密钥对。由于我们控制的主机,这是非常简单的设置。
下面是可以使用的完整命令,我将对下面的每个部分进行细分。容器的假设是它安装了systemctl和ssh,容器在主机网络上运行,root帐户的主目录已经挂载(如果需要,可以使用另一种用途)。
(ls ~/.ssh/id_rsa || ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "")
&& (grep -qxF $(cat ~/.ssh/id_rsa.pub) ~/.ssh/authorized_keys || echo $(cat ~/.ssh/id_rsa.pub) > ~/.ssh/authorized_keys)
&& (grep -qxF "StrictHostKeyChecking no" ~/.ssh/config || echo "StrictHostKeyChecking no" >> ~/.ssh/config)
&& (grep -qxF "UserKnownHostsFile /dev/null" ~/.ssh/config || echo "UserKnownHostsFile /dev/null" >> ~/.ssh/config)
&& systemctl -H root@127.0.0.1 start nfs-server.service此命令查看~/.ssh/id_rsa文件是否存在,否则创建一个文件。
(ls ~/.ssh/id_rsa || ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "")现在,如果已在文件中不存在公钥,则将公钥添加到授权密钥中。
(grep -qxF "$(cat ~/.ssh/id_rsa.pub)" ~/.ssh/authorized_keys || echo "$(cat ~/.ssh/id_rsa.pub)" > ~/.ssh/authorized_keys)如果只将它放在ssh配置的一个部分中(仅用于127.0.0.1 ),这可能会更安全,但我们需要
(grep -qxF "StrictHostKeyChecking no" ~/.ssh/config || echo "StrictHostKeyChecking no" >> ~/.ssh/config)
&& (grep -qxF "UserKnownHostsFile /dev/null" ~/.ssh/config || echo "UserKnownHostsFile /dev/null" >> ~/.ssh/config)最后,我们有了实际的systemctl命令。注意-H root@127.0.0.1。
systemctl -H root@127.0.0.1 start nfs-server.service为了获得最大的安全性,最好首先(通过Ansible或类似的)在容器之外设置键和用户,并且只允许容器内的systemctl -H命令。
https://askubuntu.com/questions/1348633
复制相似问题