含systemd的Docker镜像生成/run/nologin,如何阻止其自动重建?
Docker中Ubuntu+systemd重启后自动生成/run/nologin的问题
这是systemd的设计特性,不是bug
/run/nologin是systemd的标准机制:当它检测到系统处于初始化未完成的状态时(比如容器这种每次启动都从头初始化的轻量环境),就会创建这个文件,用来阻止用户登录,避免系统还没准备好时出现登录异常。容器每次重启都会触发systemd的初始化流程,所以这个文件会反复被重建。
阻止/run/nologin自动生成的方法
方法1:禁用systemd-firstboot.service(推荐)
从根源上解决,直接禁用触发初始化逻辑的systemd-firstboot.service,让systemd跳过首次初始化步骤,就不会生成nologin文件了。修改你的Dockerfile:
FROM ubuntu:jammy RUN apt-get update ; \ apt-get install -y systemd systemd-sysv ; \ apt-get clean ; \ # 禁用systemd-firstboot服务,跳过首次初始化 systemctl mask systemd-firstboot.service ; \ # ...你的其他清理rm命令... VOLUME [ "/sys/fs/cgroup" ] CMD ["/lib/systemd/systemd"]
方法2:添加启动自动删除nologin的自定义服务
如果不想改动默认systemd服务,可以创建一个自定义服务,在系统启动后自动删掉/run/nologin:
FROM ubuntu:jammy RUN apt-get update ; \ apt-get install -y systemd systemd-sysv ; \ apt-get clean ; \ # 创建自定义服务文件 mkdir -p /etc/systemd/system/remove-nologin.service ; \ cat > /etc/systemd/system/remove-nologin.service <<EOF [Unit] Description=自动删除/run/nologin After=sysinit.target [Service] Type=oneshot ExecStart=/bin/rm -f /run/nologin [Install] WantedBy=multi-user.target EOF # 启用该服务 systemctl enable remove-nologin.service ; \ # ...你的其他清理rm命令... VOLUME [ "/sys/fs/cgroup" ] CMD ["/lib/systemd/systemd"]
方法3:启动容器时临时删除(仅临时测试用)
如果只是临时验证效果,可以在启动命令中加入删除操作,但每次启动都要加,不够持久:
docker run --privileged --name my_container -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro my_image /bin/sh -c "rm -f /run/nologin && /lib/systemd/systemd"
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

