我正在尝试使用自定义架构创建一个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-reload
或service slapd stop
和service 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开始"并且永远不会结束。
感谢您的帮助:)
答案 0 :(得分:1)
我有同样的问题。当我在容器内时,我发现停止slapd的唯一方法是pkill slapd
然而,这不适用于Dockerfile
和run 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