Docker容器中OpenLDAP导入LDIF文件报错:文件不存在
问题:向Docker OpenLDAP容器添加条目时提示文件不存在
执行以下命令尝试向Docker容器内的OpenLDAP服务器添加条目:
docker exec -it openldap ldapadd -x -w "adminpw" -D "cn=admin,dc=exemple,dc=com" -f ${PWD}/ldif/file.ldif
出现错误:
file.ldif: No such file or directory
已确认本地${PWD}/ldif/file.ldif路径有效,以下是我的docker-compose配置:
openldap: image: osixia/openldap:latest container_name: openldap hostname: ldap-server ports: - "390:390" - "636:636" volumes: - ./data/certificates:/container/service/slapd/assets/certs - ./data/slapd/database:/var/lib/ldap - ./data/slapd/config:/etc/ldap/slapd.d environment: - LDAP_ORGANISATION=supplychain - LDAP_DOMAIN=supplychain.com - LDAP_ADMIN_USERNAME=admin - LDAP_ADMIN_PASSWORD=adminpw - LDAP_CONFIG_PASSWORD=config_pass - "LDAP_BASE_DN=dc=exemple,dc=com" #cn=admin,dc=exemple,dc=com - LDAP_TLS_CRT_FILENAME=server.crt - LDAP_TLS_KEY_FILENAME=server.key - LDAP_TLS_CA_CRT_FILENAME=exemple.com.ca.crt networks: - supplychain phpldapadmin: image: osixia/phpldapadmin:latest container_name: phpldapadmin hostname: phpldapadmin ports: - "81:80" environment: - PHPLDAPADMIN_LDAP_HOSTS=openldap - PHPLDAPADMIN_HTTPS=false depends_on: - openldap networks: - supplychain
解决方法
出现这个错误的核心原因是容器内无法访问本地的LDIF文件,因为你没有把存放LDIF文件的目录挂载到容器中。
步骤1:修改docker-compose.yml,添加LDIF目录挂载
在openldap服务的volumes部分,新增一行挂载规则,把本地的ldif目录映射到容器内的某个路径(比如/container/service/slapd/assets/ldif):volumes: - ./data/certificates:/container/service/slapd/assets/certs - ./data/slapd/database:/var/lib/ldap - ./data/slapd/config:/etc/ldap/slapd.d - ./ldif:/container/service/slapd/assets/ldif # 新增这一行步骤2:重启OpenLDAP容器
执行命令重新启动容器,让挂载生效:docker-compose down && docker-compose up -d步骤3:修改ldapadd命令,使用容器内的文件路径
现在容器内已经能访问到LDIF文件了,把命令里的文件路径换成容器内的路径:docker exec -it openldap ldapadd -x -w "adminpw" -D "cn=admin,dc=exemple,dc=com" -f /container/service/slapd/assets/ldif/file.ldif备选方案:不挂载目录,直接通过管道传入LDIF内容
如果不想修改docker-compose配置,也可以直接把本地LDIF文件的内容通过管道传给容器内的ldapadd命令:cat ${PWD}/ldif/file.ldif | docker exec -i openldap ldapadd -x -w "adminpw" -D "cn=admin,dc=exemple,dc=com"注意这里要把
-it换成-i,因为不需要交互式终端,只需要标准输入。
内容的提问来源于stack exchange,提问作者Nassreddine MEKKI
相关产品推荐
相关产品推荐

