关于 kolla-ansible 部署 openstack 时 keystone 容器启动后立即退出异常

查看原启动脚本 /etc/kolla/keystone/keystone-startup.sh

脚本最后一行是

exec /usr/sbin/apache2 $@

这会以默认方式启动 Apache;在 Debian/Ubuntu 的包里,/usr/sbin/apache2以守护进程模式(daemonize)启动,父进程(PID 1,也就是脚本本身)很快就退出,导致 Docker 认为主进程结束,容器随之退出(并返回退出码 0)。因此你看到 Exited (0) 就是这个原因 —— 不是 Apache 崩溃,而是主进程没有在前台运行。

解决办法很简单:让 Apache 以前台模式运行,把最后一行改成带 -D FOREGROUND 或使用 apache2ctl -D FOREGROUND

修改后脚本如下

#!/bin/bash -x  
  
set  -o  errexit  
set  -o  pipefail  
  
FERNET_KEY_DIR="/etc/keystone/fernet-keys"  
  
# Ensure Fernet keys are populated, check for 0 (staging) key  
n=0  
while  [  !  -f  "${FERNET_KEY_DIR}/0"  ];  do  
  if  [  $n  -lt  36  ];  then  
  n=$((  n  +  1  ))  
  echo  "ERROR: Fernet keys have not been populated, rechecking in 5 seconds"  
  echo  "DEBUG: ${FERNET_KEY_DIR} contents:"  
  ls  -l  ${FERNET_KEY_DIR}  
  sleep  5  
  else  
  echo  "CRITICAL: Waited for 3 minutes - failing"  
  exit  1  
  fi  
done  
  
exec  /usr/sbin/apache2 -D FOREGROUND $@

保存后重启 keystone 容器即可