rootless模式Docker部署git-daemon容器运行约20秒自动退出问题
问题根因
- 加
--detach参数后容器秒退无日志:Docker容器的生命周期与PID 1进程(即ENTRYPOINT指定的启动进程)强绑定,--detach参数会让git-daemon主动fork为后台守护进程,原PID 1主进程会直接退出,Docker检测到PID 1进程终止后会立刻销毁容器,fork出的后台子进程会被同步杀死,不会产生任何日志输出。所有作为容器入口点运行的服务都必须以前台模式运行,禁止自行fork为后台守护进程,这是容器运行的基础规则。 - 不加
--detach时运行约20秒退出、报错error: waitpid for git-daemon failed: No child processes、退出码128、SSH断开后必现:这是rootless Docker的默认会话生命周期限制导致的。默认配置下rootless Docker绑定到运行用户的systemd登录会话,当你SSH登录uid 1001的docker用户时,系统会为该登录会话创建独立cgroup;当SSH连接断开,系统会默认回收该会话cgroup下的所有进程,包括rootless Docker服务本身和其管理的所有容器,该故障和容器内使用root还是git用户运行服务无关。
修复步骤
- 修正git-daemon启动逻辑:删除启动参数中的
--detach,保持git-daemon以前台模式运行,你原始ENTRYPOINT配置的--base-path=/home/git --export-all --reuseaddr --enable=receive-pack参数本身是符合要求的。 - 开启用户linger配置,允许用户退出登录后保留用户级进程:使用root权限执行以下命令,将命令中
<docker_user>替换为你运行rootless Docker的用户名(即uid 1001对应的用户):
loginctl enable-linger <docker_user>
- 重启rootless Docker服务使配置生效,切换到运行Docker的普通用户身份执行:
systemctl --user restart docker
- 重新构建(如果修改了Dockerfile)并启动git-daemon容器,断开SSH后重新登录执行
docker ps验证,容器将保持稳定运行,9418端口可正常提供Git服务。
优化建议
- 你Dockerfile中安装的
git-daemon-run是集成runit服务管理的git-daemon发行包,容器场景下完全不需要额外的服务管理组件,基础git包已经自带git-daemon命令,可以删除RUN apt-get -y install git-daemon-run这行配置,减小镜像体积同时避免多余进程干扰。 - 你遇到的退出码128不符合常规
128+信号编号规则的问题,是因为会话回收时进程是被cgroup层级批量终止的,不是收到常规POSIX信号,不需要单独排查该退出码的含义,解决会话回收问题后该异常会自动消失。
内容的提问来源于stack exchange,提问作者John S.
相关产品推荐
相关产品推荐

