在Docker镜像中," Slapd stop"成功但slapd仍然在运行

时间:2015-06-05 16:42:56

标签: ldap docker openldap

我正在尝试使用自定义架构创建一个openLDAP docker镜像,我希望在修改它之前有一个可用的LDAP服务。

我在docker image中安装了slapd和ldap-utils,方法是输入dockerfile:

RUN DEBIAN_FRONTEND=noninteractive apt-get install -y slapd ldap-utils

此时,当我在新容器中打开bash时,service slapd status/etc/init.d/slapd status输出" slapd未运行"。实际上,policy-rc在安装软件包后拒绝执行start。

好吧,没问题,service slapd start返回OK并启动slapd服务。我可以在我的LDAP中搜索,修改它,一切都很好。

当我想重启slapd服务时出现问题。 service slapd restart,或service slapd force-reloadservice slapd stopservice slapd start都在" start" COMAND。 "停止"命令返回OK。但是,这次,service slapd status返回" slapd正在运行"。此外,我仍然可以在我的LDAP中搜索。

要了解更多关于发生的事情,我尝试使用debug选项启动slapd服务,如下所示:

slapd -h 'ldap:/// ldapi:///' -g openldap -u openldap -F /etc/ldap/slapd.d -d stats

不幸的是,这就是" slapd开始"并且永远不会结束。

感谢您的帮助:)

3 个答案:

答案 0 :(得分:1)

我有同样的问题。当我在容器内时,我发现停止slapd的唯一方法是pkill slapd

然而,这不适用于Dockerfilerun pkill slapd

答案 1 :(得分:0)

这是解决问题的另一种方法:

SLAPD_PID=$(cat /run/slapd/slapd.pid)
kill -15 $SLAPD_PID
while [ -e /proc/$SLAPD_PID ]; do sleep 0.1; done # wait until slapd is terminated

答案 2 :(得分:0)

我刚刚在基于minideb(Debian Buster)的docker映像中遇到了相同的问题。

在执行service slapd stop时,将调用stop_slapd脚本的/etc/init.d/slapd shell函数,依次执行以下命令:

start-stop-daemon --stop --quiet --oknodo --retry TERM/10 \
  --pidfile "/var/run/slapd/slapd.pid" \
  --exec /usr/sbin/slapd 2>&1

在根外壳程序中执行此命令并省略--quiet标志时,将显示以下错误:

root@4d1b74229670:/# start-stop-daemon --stop --oknodo --retry TERM/10 --pidfile /var/run/slapd/slapd.pid --exec /usr/sbin/slapd
No /usr/sbin/slapd found running; none killed.

/var/run/slapd/slapd.pid文件存在,/usr/sbin/slapd可执行路径也正确,并且可以看到如下所示的过程:

root@4d1b74229670:/# ps -efww | grep slapd
openldap   764     1  0 20:13 ?        00:00:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d
root       779     1  0 20:22 pts/0    00:00:00 grep slapd

要解决此问题,我更改了stop_slapd函数中的/etc/init.d/slapd并将--exec $SLAPD替换为--name slapd

stop_slapd() {
        reason="`start-stop-daemon --stop --quiet --oknodo --retry TERM/10 \
                --pidfile "$SLAPD_PIDFILE" \
                --name slapd 2>&1`"
}

我使用sed应用了更改:

sed -i 's/--exec $SLAPD 2/--name slapd 2/' /etc/init.d/slapd