CentOS7:如何在Docker容器中启动slapd服务?

时间:2019-06-17 14:37:09

标签: docker centos dockerfile openldap

我想使用CentOS7在Docker容器中运行OpenLDAP服务器。 我设法有一个装有openldap的容器。我的问题是我正在使用脚本entrypoint.sh启动slapd服务并将用户添加到我的目录中。我希望这两个步骤位于Dockerfile中,以便执行ldapadd的密码不会存储在脚本中。

到目前为止,我仅在debian上找到示例。 https://github.com/kanboard/docker-openldap/blob/master/memberUid/Dockerfile这是我想做的,但是使用CentOS 7。 我尝试在Dockerfile中启动slapd服务,但未成功。

我的Dockerfile看起来像这样:

FROM centos:7
RUN yum -y update && yum -y install \
openldap-servers \
openldap-clients \
libselinux-python \
openssl \
; yum clean all

RUN chown ldap:ldap -R /var/lib/ldap
COPY slapd.conf /etc/openldap/slapd.conf
COPY base.ldif /etc/openldap/schema/base.ldif
COPY entrypoint.sh /entrypoint.sh
RUN chmod 500 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

我的entrypoint.sh脚本如下所示:

#!/bin/bash

exec /usr/sbin/slapd -f /etc/openldap/slapd.conf -h "ldapi:/// ldap:///" -d stats &
sleep 10
ldapadd -x -w mypassword -D "cn=ldapadm,dc=mydomain" -f /etc/openldap/schema/base.ldif

这确实起作用,但是我希望启动ldap服务并在Dockerfile中执行ldapadd命令,以使mypassword不存储在entrypoint.sh中。 因此,我尝试了以下命令:

RUN systemctl slapd start
RUN ldapadd -x -w password -D "cn=ldapadm,dc=mydomain" -f /etc/openldap/schema/base.ldif

当然这不起作用,因为systemctl在Dockerfile中不起作用。最好的选择是什么?我当时正在考虑让一个容器启动ldap服务,但后来我不知道如何调用它来构建另一个容器的映像...

编辑:

感谢Guido U. Draheim,我可以使用systemctl的替代方法来启动slapd服务。

我的Dockerfile现在看起来像这样:

FROM centos:7
RUN yum -y update && yum -y install \
openldap-servers \
openldap-clients \
libselinux-python \
openssl \
; yum clean all
RUN chown ldap:ldap -R /var/lib/ldap
COPY slapd.conf /etc/openldap/slapd.conf
COPY base.ldif /etc/openldap/schema/base.ldif
COPY files/docker/systemctl.py /usr/bin/systemctl
RUN systemctl enable slapd
RUN systemctl start slapd;\
    ldapdd -x -w password -D "cn=ldapadm,dc=sblanche" -f /etc/openldap/schema/base.ldif
COPY entrypoint.sh /entrypoint.sh
RUN chmod 500 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

但是我遇到了以下错误:ldap_bind:无效的凭据(49)

1 个答案:

答案 0 :(得分:0)

(a)您可以使用docker-systemctl-replacement运行“ systemctl.py start slapd”。显然是第一个错误。

(b)dockerfile中的每个RUN都是一个新容器,因此,先前调用的运行过程无论如何都无法生存。这就是引用的dockerfile示例将其与“ &&”组合的原因。

是的(c)我正在使用openldap centos容器。因此,请再试一次。