В образе Docker остановка Slapd завершается успешно, но slapd продолжает работать.

Я пытаюсь создать образ докера openLDAP с настраиваемой схемой и хотел бы иметь работающую службу LDAP перед ее изменением.

Я установил slapd и ldap-utils в свой образ докера, вставив файл докера:

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 все терпят неудачу при команде "старт". Команда «стоп» возвращает OK. Однако на этот раз service slapd status возвращает "slapd работает". Кроме того, я все еще могу искать в своем LDAP.

Чтобы узнать немного больше о том, что произошло, я попытался запустить службу slapd с параметром отладки, например:

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

К сожалению, это зависает при запуске slapd и никогда не завершается.

Спасибо за любую помощь :)


person Guillaume Pansier    schedule 05.06.2015    source источник
comment
Вам следует взглянуть на работающий контейнер docker slapd, например github.com/nickstenning/ docker-slapd/blob/master/sh вы заметите slapd.sh и Dockerfile   -  person user2915097    schedule 05.06.2015
comment
Спасибо, мне действительно удалось заставить что-то работать благодаря уже существующему изображению. Ошибка осталась. Я не могу использовать команду service, но при запуске нового контейнера перезапускаю службу slapd.   -  person Guillaume Pansier    schedule 12.06.2015


Ответы (3)


У меня такая же проблема. Когда я нахожусь внутри контейнера, единственный способ остановить slapd — это pkill slapd

Тем не менее, это не работает с Dockerfile и run pkill slapd

person Jiujiu    schedule 23.01.2016

Это еще один способ решить проблему:

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
person Jiujiu    schedule 01.04.2016

Я только что столкнулся с той же проблемой в образе докера на основе minideb (Debian Buster).

При выполнении service slapd stop вызывается функция оболочки stop_slapd скрипта /etc/init.d/slapd, которая, в свою очередь, выполняет следующую команду:

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
person Seb T    schedule 10.11.2019