问题描述
在使用Docker镜像https://hub.docker.com/_/mongo/时,希望能够以更安全的方式初始化MongoDB的根数据库用户凭据,而不是将密码存储在配置文件中。他在compose文件中使用环境变量来初始化用户,但他想知道是否有更安全的方式,比如使用Docker Secrets。他还面临将初始化脚本文件复制到容器中的问题,这些脚本文件可能包含更多的凭据。
解决方案
请注意以下操作可能受到版本差异影响,操作前建议做好备份。
使用内置的Secrets支持
在Mongo镜像的入口脚本中,内置了对Secrets的支持。如果你想要从Secrets文件中读取用户名/密码等敏感信息,只需将_FILE
添加到用户名/密码等的末尾,镜像将会从相应的Secrets文件中获取这些值。以下是如何在Compose文件中使用这种方法的步骤:
- 创建一个
docker-compose.yml
文件。 - 在该文件中定义MongoDB服务以及其它配置。
- 在MongoDB服务的环境变量中,添加
_FILE
后缀以指向Secrets文件。
以下是一个示例docker-compose.yml
文件:
version: '3'
services:
mongodb:
image: mongo
environment:
MONGO_INITDB_DATABASE: db
MONGO_INITDB_ROOT_USERNAME: /run/secrets/mongo_root_username
MONGO_INITDB_ROOT_PASSWORD: /run/secrets/mongo_root_password
secrets:
- mongo_root_username
- mongo_root_password
secrets:
mongo_root_username:
file: ./mongo_root_username.txt
mongo_root_password:
file: ./mongo_root_password.txt
在上述示例中,我们首先定义了一个MongoDB服务,然后在该服务的环境变量中使用了_FILE
后缀,指向了Secrets文件。最后,我们在secrets
部分定义了这些Secrets的实际文件路径。
使用Ansible和Ansible Vault
另一种更加灵活的方法是使用Ansible和Ansible Vault来管理Docker容器的Secrets。这种方法可以让你更好地管理敏感信息,并且能够在版本控制中安全地存储和传输Secrets。
1. 创建Ansible Playbook
首先,创建一个Ansible Playbook来运行MongoDB容器。你可以在Playbook中使用Ansible Vault中的变量来存储Secrets,以便在运行容器时传递这些凭据。
---
- name: Run MongoDB Docker container
hosts: localhost
tasks:
- name: Start MongoDB container
docker_container:
name: mongo-container
image: mongo
ports:
- "27017:27017"
env:
MONGO_INITDB_DATABASE: "{{ secret_db_name }}"
MONGO_INITDB_ROOT_USERNAME: "{{ secret_db_user }}"
MONGO_INITDB_ROOT_PASSWORD: "{{ secret_db_pass }}"
2. 创建Ansible Vault文件
在使用Ansible Vault创建一个加密的文件来存储Secrets。你可以使用以下命令创建一个名为secrets.yml
的Vault文件:
ansible-vault create secrets.yml
然后在该文件中添加Secrets的定义,例如:
secret_db_name: mydb
secret_db_user: myuser
secret_db_pass: mypassword
3. 运行Ansible Playbook
当你想要运行MongoDB容器时,运行以下命令:
ansible-playbook playbook.yml --ask-vault-pass
这将提示你输入Vault密码,然后会使用该密码解密Vault文件,并将Secrets传递给Playbook中的任务,从而安全地运行MongoDB容器。
使用Ansible和Ansible Vault的方法可以更好地管理和保护敏感信息,同时也允许你在版本控制中跟踪这些Secrets的变化。
请注意,这个方法引入了Ansible作为一个额外的工具,可能会增加一些复杂性,但它能够提供更强大的Secrets管理能力。
请根据你的实际情况,选择合适的方法来管理MongoDB容器中的凭据信息。
这些解决方案可以帮助你以更安全的方式管理MongoDB容器的凭据信息,确保敏感信息不会被直接暴露在配置文件中。
注意:以上解决方案可能会受到版本差异的影响,建议在操作前进行充分的了解和测试。