实现以systemd为PID 1的Docker容器自动root登录
问题:Docker容器以systemd为PID 1自动root登录,无需提示获取shell
我正尝试让Docker容器实现以systemd为PID 1的自动root登录,无需任何提示即可获取shell权限。
当前Dockerfile修改
(原内容附相关配置修改截图)
使用的docker run命令
docker run -it -v /sys/fs/cgroup/:/sys/fs/cgroup:ro --tmpfs /run --tmpfs /run/lock --tmpfs /tmp --cap-add=SYS_ADMIN --name=tty4 tty4
执行后输出
(原内容附执行输出截图)
预期效果
容器能自动完成登录,直接进入root shell并显示终端提示符。
已尝试的配置
(原内容附2项配置修改截图)
尝试过的ENTRYPOINT脚本
(原内容附5项脚本内容截图)
注意事项
- 不使用podman;
- docker run命令需一次性返回终端提示符,且systemd以PID 1运行;
- 不希望先以守护进程模式运行容器再exec进入,需一步完成运行并进入容器。
解决方案
1. 调整Dockerfile配置
确保基础镜像自带systemd(如CentOS、Ubuntu Server等发行版镜像),添加以下配置:
- 配置自动登录:创建
/etc/systemd/system/getty@tty1.service.d/override.conf文件,内容如下:
[Service] ExecStart= ExecStart=-/sbin/agetty --autologin root --noclear tty1 $TERM Type=idle
- 启用自动登录服务:在Dockerfile中添加命令:
RUN systemctl enable getty@tty1.service
- 确保root shell正常:确认
/etc/passwd中root条目末尾为/bin/bash(多数镜像默认已配置)。
2. 设置容器启动命令
Dockerfile末尾直接设置启动systemd,不要用自定义脚本替换PID1进程:
CMD ["/sbin/init"]
3. 优化docker run命令
保留你原有命令中systemd运行所需的挂载和权限,确保终端附加:
docker run -it --rm -v /sys/fs/cgroup:/sys/fs/cgroup:ro --tmpfs /run --tmpfs /run/lock --tmpfs /tmp --cap-add=SYS_ADMIN --name=tty4 tty4
(--rm为可选参数,用于容器退出后自动清理)
核心说明
- systemd作为PID1运行时,会自动管理getty终端服务,通过
agetty --autologin root参数跳过登录提示直接进入shell; /sys/fs/cgroup挂载和--tmpfs配置是systemd正常初始化的必要条件;-it参数确保容器分配交互式终端并直接附加到当前会话,运行后直接返回root shell提示符,无需额外exec操作。
内容的提问来源于stack exchange,提问作者Avinash Chandravansi
相关产品推荐
相关产品推荐

