在 Docker 镜像中,“Slapd 停止”成功但 slapd 仍在运行

问题描述 投票:0回答:4

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

我通过放入 dockerfile 在我的 docker 镜像中安装了 slapd 和 ldap-utils:

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

此时,当我在新容器中打开一个 bash 时,

service slapd status
/etc/init.d/slapd status
都输出“slapd is not running”。实际上,policy-rc 拒绝在安装包后执行启动。

嗯,没问题,

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

想重启slapd服务的时候问题来了。

service slapd restart
,或
service slapd force-reload
service slapd stop
service slapd start
都在“开始”命令时失败。 “停止”命令返回 OK。然而,这一次,
service slapd status
返回“slapd is running”。另外,我仍然可以在我的 LDAP 中搜索。

为了更多地了解发生了什么,我尝试使用调试选项启动 slapd 服务,如:

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

不幸的是,这挂在“slapd starting”并且永远不会结束。

感谢您的帮助:)

ldap docker openldap
4个回答
1
投票

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

pkill slapd

尽管如此,这不适用于

Dockerfile
run pkill slapd


1
投票

我刚刚在基于 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

当您在 root shell 中执行此命令并省略

--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

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

0
投票

这个对我有用,请记住我使用的是

ubuntu:22.04
图像

ENV DEBIAN_FRONTEND=noninteractive
RUN echo 'slapd/root_password password password' | debconf-set-selections && \
    echo 'slapd/root_password_again password password' | debconf-set-selections && \
    apt install -y slapd ldap-utils
© www.soinside.com 2019 - 2024. All rights reserved.