bitnami/openldapOpenLDAP is the open-source solution for LDAP (Lightweight Directory Access Protocol). It is a protocol used to store and retrieve data from a hierarchical directory structure such as in databases.
Overview of OpenLDAP Trademarks: This software listing is packaged by Bitnami. The respective trademarks mentioned in the offering are owned by the respective companies, and use of them does not imply any affiliation or endorsement.
consoledocker run --name openldap bitnami/openldap:latest
Those are hardened, minimal CVE images built and maintained by Bitnami. Bitnami Secure Images are based on the cloud-optimized, security-hardened enterprise OS Photon Linux. Why choose BSI images?
Each image comes with valuable security metadata. You can view the metadata in our public catalog here. Note: Some data is only available with commercial subscriptions to BSI.
!Alt text !Alt text
If you are looking for our previous generation of images based on Debian Linux, please see the Bitnami Legacy registry.
Non-root container images add an extra layer of security and are generally recommended for production environments. However, because they run as a non-root user, privileged tasks are typically off-limits. Learn more about non-root containers in our docs.
Dockerfile linksLearn more about the Bitnami tagging policy and the difference between rolling tags and immutable tags in our documentation page.
You can see the equivalence between the different tags by taking a look at the tags-info.yaml file present in the branch folder, i.e bitnami/ASSET/BRANCH/DISTRO/tags-info.yaml.
Subscribe to project updates by watching the bitnami/containers GitHub repo.
The recommended way to get the Bitnami OpenLDAP Docker Image is to pull the prebuilt image from the Docker Hub Registry.
consoledocker pull bitnami/openldap:latest
To use a specific version, you can pull a versioned tag. You can view the list of available versions in the Docker Hub Registry.
consoledocker pull bitnami/openldap:[TAG]
If you wish, you can also build the image yourself by cloning the repository, changing to the directory containing the Dockerfile and executing the docker build command. Remember to replace the APP, VERSION and OPERATING-SYSTEM path placeholders in the example command below with the correct values.
consolegit clone [***] cd bitnami/APP/VERSION/OPERATING-SYSTEM docker build -t bitnami/APP:latest .
Using Docker container networking, a different server running inside a container can easily be accessed by your application containers and vice-versa.
Containers attached to the same network can communicate with each other using the container name as the hostname.
In this example, we will use a MariaDB Galera instance that will use a OpenLDAP instance that is running on the same docker network to manage authentication.
consoledocker network create my-network --driver bridge
Use the --network <NETWORK> argument to the docker run command to attach the container to the my-network network.
consoledocker run --detach --rm --name openldap \ --network my-network \ --env LDAP_ADMIN_USERNAME=admin \ --env LDAP_ADMIN_PASSWORD=adminpassword \ --env LDAP_USERS=customuser \ --env LDAP_PASSWORDS=custompassword \ --env LDAP_ROOT=dc=example,dc=org \ --env LDAP_ADMIN_DN=cn=admin,dc=example,dc=org \ bitnami/openldap:latest
Use the --network <NETWORK> argument to the docker run command to attach the container to the my-network network.
consoledocker run --detach --rm --name mariadb-galera \ --network my-network \ --env MARIADB_ROOT_PASSWORD=root-password \ --env MARIADB_GALERA_MARIABACKUP_PASSWORD=backup-password \ --env MARIADB_USER=customuser \ --env MARIADB_DATABASE=customdatabase \ --env MARIADB_ENABLE_LDAP=yes \ --env LDAP_URI=ldap://openldap:1389 \ --env LDAP_BASE=dc=example,dc=org \ --env LDAP_BIND_DN=cn=admin,dc=example,dc=org \ --env LDAP_BIND_PASSWORD=adminpassword \ bitnami/mariadb-galera:latest
Finally we create a new container instance to launch the MariaDB client and connect to the server created in the previous step:
consoledocker run -it --rm --name mariadb-client \ --network my-network \ bitnami/mariadb-galera:latest mysql -h mariadb-galera -u customuser -D customdatabase -pcustompassword
When not specified, Docker Compose automatically sets up a new network and attaches all deployed services to that network. However, we will explicitly define a new bridge network named my-network. In this example we assume that you want to connect to the OpenLDAP server from your own custom application image which is identified in the following snippet by the service name myapp.
yamlversion: '2' networks: my-network: driver: bridge services: openldap: image: bitnami/openldap:latest ports: - 1389:1389 - 1636:1636 environment: - LDAP_ADMIN_USERNAME=admin - LDAP_ADMIN_PASSWORD=adminpassword - LDAP_USERS=user01,user02 - LDAP_PASSWORDS=password1,password2 networks: - my-network volumes: - openldap_data:/bitnami/openldap myapp: image: YOUR_APPLICATION_IMAGE networks: - my-network volumes: openldap_data: driver: local
IMPORTANT:
- Please update the YOUR_APPLICATION_IMAGE_ placeholder in the above snippet with your application image
- In your application container, use the hostname
openldapto connect to the OpenLDAP server
Launch the containers using:
consoledocker-compose up -d
The Bitnami Docker OpenLDAP can be easily setup with the following environment variables:
LDAP_PORT_NUMBER: The port OpenLDAP is listening for requests. Priviledged port is supported (e.g. 389). Default: 1389 (non privileged port).LDAP_ROOT: LDAP baseDN (or suffix) of the LDAP tree. Default: dc=example,dc=orgLDAP_ADMIN_USERNAME: LDAP database admin user. Default: adminLDAP_ADMIN_PASSWORD: LDAP database admin password. Default: adminpasswordLDAP_ADMIN_PASSWORD_FILE: Path to a file that contains the LDAP database admin user password. This will override the value specified in LDAP_ADMIN_PASSWORD. No defaults.LDAP_CONFIG_ADMIN_ENABLED: Whether to create a configuration admin user. Default: no.LDAP_CONFIG_ADMIN_USERNAME: LDAP configuration admin user. This is separate from LDAP_ADMIN_USERNAME. Default: admin.LDAP_CONFIG_ADMIN_PASSWORD: LDAP configuration admin password. Default: configpassword.LDAP_CONFIG_ADMIN_PASSWORD_FILE: Path to a file that contains the LDAP configuration admin user password. This will override the value specified in LDAP_CONFIG_ADMIN_PASSWORD. No defaults.LDAP_USERS: Comma separated list of LDAP users to create in the default LDAP tree. Default: user01,user02LDAP_PASSWORDS: Comma separated list of passwords to use for LDAP users. Default: bitnami1,bitnami2LDAP_USER_OU: Name for the user's organizational unit. Default: usersLDAP_GROUP_OU: Name for the group's organizational unit. Default: groupsLDAP_USER_DC: DC for the users' organizational unit. DEPRECATED Please use LDAP_USER_OU and LDAP_GROUP_OU instead.LDAP_GROUP: Group used to group created users. Default: readersLDAP_ADD_SCHEMAS: Whether to add the schemas specified in LDAP_EXTRA_SCHEMAS. Default: yesLDAP_EXTRA_SCHEMAS: Extra schemas to add, among OpenLDAP's distributed schemas. Default: cosine, inetorgperson, nisLDAP_SKIP_DEFAULT_TREE: Whether to skip creating the default LDAP tree based on LDAP_USERS, LDAP_PASSWORDS, LDAP_USER_OU, LDAP_GROUP_OU and LDAP_GROUP. Please note that this will not skip the addition of schemas or importing of LDIF files. Default: noLDAP_CUSTOM_LDIF_DIR: Location of a directory that contains LDIF files that should be used to bootstrap the database. Only files ending in .ldif will be used. Default LDAP tree based on the LDAP_USERS, LDAP_PASSWORDS, LDAP_USER_OU, LDAP_GROUP_OU and LDAP_GROUP will be skipped when LDAP_CUSTOM_LDIF_DIR is used. When using this it will override the usage of LDAP_USERS, LDAP_PASSWORDS, LDAP_USER_OU, LDAP_GROUP_OU and LDAP_GROUP. You should set LDAP_ROOT to your base to make sure the olcSuffix configured on the database matches the contents imported from the LDIF files. Default: /ldifsLDAP_CUSTOM_SCHEMA_FILE: Location of a custom internal schema file that could not be added as custom ldif file (i.e. containing some structuralObjectClass). Default is /schema/custom.ldif"LDAP_CUSTOM_SCHEMA_DIR: Location of a directory containing custom internal schema files that could not be added as custom ldif files (i.e. containing some structuralObjectClass). This can be used in addition to or instead of LDAP_CUSTOM_SCHEMA_FILE (above) to add multiple schema files. Default: /schemasLDAP_ULIMIT_NOFILES: Maximum number of open file descriptors. Default: 1024.LDAP_ALLOW_ANON_BINDING: Allow anonymous bindings to the LDAP server. Default: yes.LDAP_LOGLEVEL: Set the loglevel for the OpenLDAP server (see <[***]> for possible values). Default: 256.LDAP_PASSWORD_HASH: Hash to be used in generation of user passwords. Must be one of {SSHA}, {SHA}, {SMD5}, {MD5}, {CRYPT}, and {CLEARTEXT}. Default: {SSHA}.LDAP_CONFIGURE_PPOLICY: Enables the ppolicy module and creates an empty configuration. Default: no.LDAP_PPOLICY_USE_LOCKOUT: Whether bind attempts to locked accounts will always return an error. Will only be applied with LDAP_CONFIGURE_PPOLICY active. Default: no.LDAP_PPOLICY_HASH_CLEARTEXT: Whether plaintext passwords should be hashed automatically. Will only be applied with LDAP_CONFIGURE_PPOLICY active. Default: no.User side bootstrapping happens in two primary phases:
Note: Image level modifications, like modules and tools might require a custom Dockerfile that uses the bitnami-openldap as it's base if you need to modify image paths as root, some stuff might be doable in /docker-entrypoint-initdb.d/
Check the official OpenLDAP Configuration Reference for more information about how to configure OpenLDAP.
Some key concepts:
-F /opt/bitnami/openldap/etc/slapd.d -b cn=configldapadd -Q -Y EXTERNAL -H "ldapi:///" -f /ldifs/01-enable-memberof-overlay.ldif. Many doc sources suggest using ldapadd but slapd isn't running yet.changetype: modify directives required by ldapadd.Example: Enable the MemberOf Overlay in Bitnami OpenLDAP
Note: bitnami has some custom module pathing. Specifically the slapd module load path is set to /opt/bitnami/openldap/libexec/openldap/ but some of the base openldap modules are installed at /opt/bitnami/openldap/lib/openldap/. If you need to load the memberof.so overlay you will need to symlink, or cp it. exapmle cp /opt/bitnami/openldap/lib/openldap/memberof.so /opt/bitnami/openldap/lib/openldap/memberof.so. This could be done in a Dockerfile, a mount overlay or if running as root in a script in /docker-entrypoint-initdb.d/. The Dockerfile is likely the best and safest solution to ensure your module is always avialable at run time.
Here is an example of loading the memberof overlay with an /entrypoint-initdb.d/ script
The memberOf overlay is widely used in OpenLDAP to automatically populate the memberOf attribute on user entries based on group membership.
This short example demonstrates how to add the overlay during Bitnami OpenLDAP container bootstrap using slapadd, with correct LDIF formatting and troubleshooting tips.
Determine the next available module DN:
Run:
shslapcat -F /opt/bitnami/openldap/etc/slapd.d -b cn=config | grep "^dn: cn=module"
If you see cn=module{0},cn=config, use cn=module{1},cn=config for your new module. {2} if you see existing {1} etc.
Create the LDIF file:
In the default container image has 1 existing loaded module at cn=module{0} so we will use cn=module{1}. Be sure to also bump the index on cn: module{1} to match cn=module{1}
ldifdn: cn=module{1},cn=config objectClass: olcModuleList cn: module{1} olcModulePath: /opt/bitnami/openldap/libexec/openldap olcModuleLoad: memberof.so dn: olcOverlay=memberof,olcDatabase={2}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcMemberOf olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf
Finally a script should be placed or mounted to /docker-entrypoint-initdb.d/. Note: we are using slapadd, not ldapadd here as mentioned above.
bash#!/bin/bash # Script to enable memberOf overlay in OpenLDAP set -e # Note: cn=module{1},cn=config assumes that the module will be loaded as the second module. cn=module{0} being the first. # Additionally, olcDatabase={2}mdb assumes that the database is the second one configured in OpenLDAP. Adjust as necessary. # Create a temporary LDIF file # ensure cn=module{N},cn=config and cn: module{N} match eachother and do not conflict with existing modules. Run `slapcat -F /opt/bitnami/openldap/etc/slapd.d -b cn=config | grep 'cn=module'` to check existing modules. cat > /tmp/memberof-overlay.ldif << 'EOF' dn: cn=module{1},cn=config objectClass: olcModuleList cn: module{1} olcModuleLoad: memberof dn: olcOverlay=memberof,olcDatabase={2}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcMemberOf olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf EOF # Apply the LDIF to enable memberOf overlay echo "Enabling memberOf overlay in OpenLDAP configuration..." echo "Loading memberOf overlay with slapadd..." if slapcat -F /opt/bitnami/openldap/etc/slapd.d -b cn=config | grep -q memberof then echo "MemberOf overlay is already configured." exit 0 else slapadd -F /opt/bitnami/openldap/etc/slapd.d -b cn=config -l /tmp/memberof-overlay.ldif || { echo "NOTICE: slapadd failed to load memberOf overlay. Check the cn=module{N} with \"slapcat -F /opt/bitnami/openldap/etc/slapd.d -b cn=config |grep 'cn=module'\"" exit 1 } fi echo "MemberOf overlay has been configured."
You can bootstrap the contents of your database by putting LDIF files in the directory /ldifs (or the one you define in LDAP_CUSTOM_LDIF_DIR). Those may only contain content underneath your base DN (set by LDAP_ROOT). You can not set configuration for e.g. cn=config in those files.
Some key concepts:
cn=config here, use the /docker-entrypoint-initdb.d/ method!Example: Loading base groups and org schemas in /ldifs/01-example-org.ldif (or equiv)
Place or mount your ldif files in /ldifs... That's basically it! Verify with ldapsearch or in your healthchecks etc. once the container has loaded.
ldif# Base domain entries - converting AD-style DN to OpenLDAP format dn: dc=your,dc=example,dc=com objectClass: top objectClass: dcObject objectClass: organization dc: your o: Your Organization # Organizational Units dn: ou=Users,dc=your,dc=example,dc=com objectClass: top objectClass: organizationalUnit ou: Users dn: ou=Groups,dc=your,dc=example,dc=com objectClass: top objectClass: organizationalUnit ou: Groups # Admin group dn: cn=some_admins,ou=Groups,dc=your,dc=example,dc=com objectClass: top objectClass: groupOfNames cn: some_admins description: An administrators group # Tester group dn: cn=testers,ou=Groups,dc=your,dc=example,dc=com objectClass: top objectClass: groupOfNames cn: testers description: Example group of testers
To ensure that the OpenLDAP state is retained across container restarts and updates, it is recommended to mount a volume at /bitnami/openldap.
Overlays are dynamic modules that can be added to an OpenLDAP server to extend or modify its functionality. See section on Bootstrapping for an example on adding the memberOf or other overlays not directly provided as an overlay flag.
This overlay can record accesses to a given backend database on another database.
LDAP_ENABLE_ACCESSLOG: Enables the accesslog module with the following configuration defaults unless specified otherwise. Default: no.LDAP_ACCESSLOG_ADMIN_USERNAME: Admin user for accesslog database. Default: admin.LDAP_ACCESSLOG_ADMIN_PASSWORD: Admin password for accesslog database. Default: accesspassword.LDAP_ACCESSLOG_DB: The DN (Distinguished Name) of the database where the access log entries will be stored. Will only be applied with LDAP_ENABLE_ACCESSLOG active. Default: cn=accesslog.LDAP_ACCESSLOG_LOGOPS: Specify which types of operations to log. Valid aliases for common sets of operations are: writes, reads, session or all. Will only be applied with LDAP_ENABLE_ACCESSLOG active. Default: writes.LDAP_ACCESSLOG_LOGSUCCESS: Whether successful operations should be logged. Will only be applied with LDAP_ENABLE_ACCESSLOG active. Default: TRUE.LDAP_ACCESSLOG_LOGPURGE: When and how often old access log entries should be purged. Format "dd+hh:mm". Will only be applied with LDAP_ENABLE_ACCESSLOG active. Default: 07+00:00 01+00:00.LDAP_ACCESSLOG_LOGOLD: An LDAP filter that determines which entries should be logged. Will only be applied with LDAP_ENABLE_ACCESSLOG active. Default: (objectClass=*).LDAP_ACCESSLOG_LOGOLDATTR: Specifies an attribute that should be logged. Will only be applied with LDAP_ENABLE_ACCESSLOG active. Default: objectClass.Check the official page OpenLDAP, Overlays, Access Logging for detailed configuration information.
LDAP_ENABLE_SYNCPROV: Enables the syncrepl module with the following configuration defaults unless specified otherwise. Default: no.LDAP_SYNCPROV_CHECKPPOINT: For every 100 operations or 10 minutes, which ever is sooner, the contextCSN will be checkpointed. Will only be applied with LDAP_ENABLE_SYNCPROV active. Default: 100 10.LDAP_SYNCPROV_SESSIONLOG: The maximum number of session log entries the session log can record. Will only be applied with LDAP_ENABLE_SYNCPROV active. Default: 100.Check the official page OpenLDAP, Overlays, Sync Provider for detailed configuration information.
The overlays dynlist and memberof both require the operational memberOf attribute to be present in the loaded schema. During initialization, a check is performed for the presence of this attribute; if it is absent, it is created programmatically.
At the same time, the msuser schema declares the same attribute. If both the schema and at least one of the overlays are required, a conflict may arise depending on the load order, such as whether the schema is loaded before or after the overlays. If the overlays are loaded first, the process stops and raises a Duplicate attribute error.
In a standard OpenLDAP installation (deb or rpm), its configuration is stored in the main file, which may include another one. In this case, the order is determined by the order of directives.
For configuration flexibility, the container-based approach relies on a file tree structure rather than a master file with includes. To ensure the correct order, the file tree must be read deterministically. Fortunately, Linux sorts folder content using alphanumeric order. This allows overlay loading after the schema by using a keyword that is after schema in alphanumeric sorting (i.e. cn=z-module{N} will be loaded after cn=schema as they are both children of cn=config). Doing so, the configuration merging msuser schema and dynlist (or memberof) will load without errors.
IMPORTANT: The dynlist requires the schema dyngroup. This can be done by adding it to the list of schemas to load through LDAP_EXTRA_SCHEMAS.
The following example shows how to declare the module dynlist with the support of dynamic (groupOfUrls) and static (groupOfNames) groups. The olcDatabase={N}mdb has to be adjusted to the target configuration.
bashldapadd -D "cn=admin,cn=config" -w "configpassword" <<EOF dn: cn=z-module,cn=config objectClass: olcModuleList cn: z-module olcModuleLoad: dynlist.so olcModulePath: /opt/bitnami/openldap/lib/openldap dn: olcOverlay=dynlist,olcDatabase={N}mdb,cn=config objectClass: olcConfig objectClass: olcDynListConfig objectClass: olcOverlayConfig objectClass: top olcOverlay: dynlist olcDynListAttrSet: groupOfUrls memberURL member+memberOf@groupOfNames EOF
This example is compatible with or without the usage of the msuser schema.
Check the official page OpenLDAP, Overlays, Dynamic Lists for detailed configuration information.
OpenLDAP clients and servers are capable of using the Transport Layer Security (TLS) framework to provide integrity and confidentiality protections and to support LDAP authentication using the SASL EXTERNAL mechanism. Should you desire to enable this optional feature, you may use the following environment variables to configure the application:
LDAP_ENABLE_TLS: Whether to enable TLS for traffic or not. Defaults to no.LDAP_REQUIRE_TLS: Whether connections must use TLS. Will only be applied with LDAP_ENABLE_TLS active. Defaults to no.LDAP_LDAPS_PORT_NUMBER: Port used for TLS secure traffic. Privil_Note: the README for this container is longer than the DockerHub length limit of 25000, so it has been trimmed. The full README can be found at [***]
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像服务
在 Docker Desktop 配置镜像
Docker Compose 项目配置
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
MacOS OrbStack 容器配置
在宝塔面板一键配置镜像
Synology 群晖 NAS 配置
飞牛 fnOS 系统配置镜像
极空间 NAS 系统配置服务
爱快 iKuai 路由系统配置
绿联 NAS 系统配置镜像
QNAP 威联通 NAS 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
免费版仅支持 Docker Hub 访问,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等;免费版仅支持 docker.io。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
来自真实用户的反馈,见证轩辕镜像的优质服务