在Docker中使用MongoDB镜像 – 如何指定除了在compose文件中以外的凭据

81次阅读
没有评论

问题描述

在使用Docker镜像https://hub.docker.com/_/mongo/时,希望能够以更安全的方式初始化MongoDB的根数据库用户凭据,而不是将密码存储在配置文件中。他在compose文件中使用环境变量来初始化用户,但他想知道是否有更安全的方式,比如使用Docker Secrets。他还面临将初始化脚本文件复制到容器中的问题,这些脚本文件可能包含更多的凭据。

解决方案

请注意以下操作可能受到版本差异影响,操作前建议做好备份。

使用内置的Secrets支持

在Mongo镜像的入口脚本中,内置了对Secrets的支持。如果你想要从Secrets文件中读取用户名/密码等敏感信息,只需将_FILE添加到用户名/密码等的末尾,镜像将会从相应的Secrets文件中获取这些值。以下是如何在Compose文件中使用这种方法的步骤:

  1. 创建一个docker-compose.yml文件。
  2. 在该文件中定义MongoDB服务以及其它配置。
  3. 在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容器的凭据信息,确保敏感信息不会被直接暴露在配置文件中。

注意:以上解决方案可能会受到版本差异的影响,建议在操作前进行充分的了解和测试。

正文完