如何在启动时加载 LDAP docker 容器数据
How to load LDAP docker container data on startup
我想在 docker 容器上安装一个 LDAP 服务器,我已经使用了 dinkel/openldap, osixia/openldap and muzili/ldap docker 个图像,到目前为止连接和第一次配置都正常。
我的问题是:虽然我挂载了容器的 /var/lib/ldap & /etc/ldap,但在停止、终止或删除之前总是需要备份(安全删除,docker rm without -v ) ldap 容器,否则会丢失数据。而且它似乎没有遍历所有配置文件,因为它还需要在开始时导入数据。
我想我可能会遇到 docker 容器及其卷安装的一些问题,但其他所有容器安装都是成功的,而且似乎只有 ldap 容器有问题。
有什么解决方案可以让它工作吗?(通过读取挂载的文件夹而不丢失数据在启动时配置?)
您可以先启动另一个容器来备份文件夹。
假设名为 ldap
的 ldap 容器,它有两个卷:/var/lib/ldap & /etc/ldap
,使用以下命令,您可以轻松备份它们。
docker run --volumes-from ldap -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/ldap /etc/ldap
如果运行一个新容器需要输入一些配置,可以考虑用ONBUILD
命令更新Dockerfile,例如:
ONBUILD cp . /etc/ldap
ONBUILD COMMAND you'd like to run
使用上面的代码,你的图像可以保持不变(不需要重新构建),但是当你启动容器时,它会在启动容器时将设置输入/etc/ldap,并得到之后是一些命令 运行。
参考:
(已解决!)
要清除解决方案:
就像 BMW ldap container has 2 volumes, which was removed when mounted to empty folder in mounting section of ansible role docker module.
So I first run a non-mounted ldap container and backup it's volumes as suggested by BMW 的回答一样。然后杀死并删除它和 运行 备份数据的全新容器。然后对于用户数据配置,我 运行 另一个 ldap 容器(来自同一图像),它只需要从配置文件中注册用户数据。
最终 Ansible 角色代码:
- name: run temporary ldap container
docker:
image: muzili/ldap
name: temporary-ldap
hostname: temporary-ldap
state: restarted
ports: 389:389
env:
SLAPD_PASSWORD: ******
SLAPD_DOMAIN: dev.domain.com
- name: ldap data copy container
docker:
image: ubuntu
name: backup_agent
state: started
volumes:
- /backup
volumes_from:
- temporary-ldap
command: tar cvf /backup/backup.tar /var/lib/ldap /etc/ldap
- name: copy compressed data from backup_agent
command: /usr/bin/docker cp backup_agent:/backup/backup.tar "{{base_dir}}/ldap/import"
- name: extract ldap configuration data
unarchive:
copy: "no"
src: "{{base_dir}}/ldap/import/backup.tar"
dest: "{{base_dir}}/ldap"
- name: kill temporary ldap container
docker:
image: muzili/ldap
name: temporary-ldap
state: absent
- name: run main ldap container
docker:
image: muzili/ldap
name: ldap-server
hostname: ldap-server
state: running
ports: 389:389
env:
SLAPD_PASSWORD: ******
SLAPD_DOMAIN: dev.domain.com
volumes:
- "{{base_dir}}/ldap/etc/ldap:/etc/ldap"
- "{{base_dir}}/ldap/var/lib/ldap:/var/lib/ldap"
- name: wait for container to start
wait_for:
port: 389
delay: 5
- name: copy ldap data configuration file
copy:
src: conf/
dest: "{{base_dir}}/ldap/import/conf"
- name: run ldap-importer container
docker:
image: muzili/ldap
name: ldap-importer
hostname: ldap-importer
state: started
volumes:
- "{{base_dir}}/ldap/import/conf:/etc/ldap/conf"
command: "ldapadd -h ldap-server -c -x -D \"cn=admin,dc=dev,dc=domain,dc=com\" -w ****** -f /etc/ldap/conf/data.ldif"
links:
- "ldap-server"
我想在 docker 容器上安装一个 LDAP 服务器,我已经使用了 dinkel/openldap, osixia/openldap and muzili/ldap docker 个图像,到目前为止连接和第一次配置都正常。
我的问题是:虽然我挂载了容器的 /var/lib/ldap & /etc/ldap,但在停止、终止或删除之前总是需要备份(安全删除,docker rm without -v ) ldap 容器,否则会丢失数据。而且它似乎没有遍历所有配置文件,因为它还需要在开始时导入数据。
我想我可能会遇到 docker 容器及其卷安装的一些问题,但其他所有容器安装都是成功的,而且似乎只有 ldap 容器有问题。
有什么解决方案可以让它工作吗?(通过读取挂载的文件夹而不丢失数据在启动时配置?)
您可以先启动另一个容器来备份文件夹。
假设名为 ldap
的 ldap 容器,它有两个卷:/var/lib/ldap & /etc/ldap
,使用以下命令,您可以轻松备份它们。
docker run --volumes-from ldap -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/ldap /etc/ldap
如果运行一个新容器需要输入一些配置,可以考虑用ONBUILD
命令更新Dockerfile,例如:
ONBUILD cp . /etc/ldap
ONBUILD COMMAND you'd like to run
使用上面的代码,你的图像可以保持不变(不需要重新构建),但是当你启动容器时,它会在启动容器时将设置输入/etc/ldap,并得到之后是一些命令 运行。
参考:
(已解决!)
要清除解决方案:
就像 BMW ldap container has 2 volumes, which was removed when mounted to empty folder in mounting section of ansible role docker module.
So I first run a non-mounted ldap container and backup it's volumes as suggested by BMW 的回答一样。然后杀死并删除它和 运行 备份数据的全新容器。然后对于用户数据配置,我 运行 另一个 ldap 容器(来自同一图像),它只需要从配置文件中注册用户数据。
最终 Ansible 角色代码:
- name: run temporary ldap container
docker:
image: muzili/ldap
name: temporary-ldap
hostname: temporary-ldap
state: restarted
ports: 389:389
env:
SLAPD_PASSWORD: ******
SLAPD_DOMAIN: dev.domain.com
- name: ldap data copy container
docker:
image: ubuntu
name: backup_agent
state: started
volumes:
- /backup
volumes_from:
- temporary-ldap
command: tar cvf /backup/backup.tar /var/lib/ldap /etc/ldap
- name: copy compressed data from backup_agent
command: /usr/bin/docker cp backup_agent:/backup/backup.tar "{{base_dir}}/ldap/import"
- name: extract ldap configuration data
unarchive:
copy: "no"
src: "{{base_dir}}/ldap/import/backup.tar"
dest: "{{base_dir}}/ldap"
- name: kill temporary ldap container
docker:
image: muzili/ldap
name: temporary-ldap
state: absent
- name: run main ldap container
docker:
image: muzili/ldap
name: ldap-server
hostname: ldap-server
state: running
ports: 389:389
env:
SLAPD_PASSWORD: ******
SLAPD_DOMAIN: dev.domain.com
volumes:
- "{{base_dir}}/ldap/etc/ldap:/etc/ldap"
- "{{base_dir}}/ldap/var/lib/ldap:/var/lib/ldap"
- name: wait for container to start
wait_for:
port: 389
delay: 5
- name: copy ldap data configuration file
copy:
src: conf/
dest: "{{base_dir}}/ldap/import/conf"
- name: run ldap-importer container
docker:
image: muzili/ldap
name: ldap-importer
hostname: ldap-importer
state: started
volumes:
- "{{base_dir}}/ldap/import/conf:/etc/ldap/conf"
command: "ldapadd -h ldap-server -c -x -D \"cn=admin,dc=dev,dc=domain,dc=com\" -w ****** -f /etc/ldap/conf/data.ldif"
links:
- "ldap-server"