【问题标题】:How to create a DB for MongoDB container on start up?如何在启动时为 MongoDB 容器创建数据库?
【发布时间】:2017-08-12 06:30:58
【问题描述】:

我正在使用 Docker,并且我有一个包含 PHP、MySQL、Apache 和 Redis 的堆栈。我现在需要添加 MongoDB,所以我正在检查 Dockerfile 的最新版本以及 MongoDB Dockerhub 中的 the docker-entrypoint.sh 文件,但我找不到设置默认数据库、管理员用户/密码和可能的身份验证的方法来自docker-compose.yml 文件的容器的方法。

在 MySQL 中,您可以设置一些 ENV 变量,例如:

db:
    image: mysql:5.7
    env_file: .env
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

这会将数据库和用户/密码设置为root 密码。

有没有办法用 MongoDB 实现同样的效果?有人有经验或解决方法吗?

【问题讨论】:

  • 能不能基于mysql创建一个容器,随意设置,然后使用?
  • @Valentin 我当然可以,但你的意思是什么?
  • 我的意思是,您可以使用变量在 dockerfile 中设置默认数据库、管理员用户/密码和可能的身份验证方法,然后将它们传递到 compose 文件中
  • 注意:如果使用任何使用 mongo-init 脚本的解决方案,请确保为依赖于 mongo 的容器设置了 restart: unless-stopped (或除 no 之外的其他内容)。这是因为这些容器在初始化时将无法连接到 mongo(即使使用 depends_on 标志)。有关详细信息,请参阅此线程stackoverflow.com/questions/31746182/…

标签: mongodb docker docker-compose


【解决方案1】:

这里使用docker-composejs 脚本的另一个更清洁的解决方案。

此示例假定两个文件(docker-compose.yml 和 mongo-init.js)位于同一个文件夹中。

docker-compose.yml

version: '3.7'

services:
    mongodb:
        image: mongo:latest
        container_name: mongodb
        restart: always
        environment:
            MONGO_INITDB_ROOT_USERNAME: <admin-user>
            MONGO_INITDB_ROOT_PASSWORD: <admin-password>
            MONGO_INITDB_DATABASE: <database to create>
        ports:
            - 27017:27017
        volumes:
            - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro

mongo-init.js

db.createUser(
        {
            user: "<user for database which shall be created>",
            pwd: "<password of user>",
            roles: [
                {
                    role: "readWrite",
                    db: "<database to create>"
                }
            ]
        }
);

然后只需运行以下 docker-compose 命令即可启动服务

docker-compose up --build -d mongodb 

注意:docker-entrypoint-init.d 文件夹中的代码只有在数据库之前从未初始化过的情况下才会执行。

【讨论】:

  • mongo-init.js:ro 是什么?
  • @HerilMuratovic,volumes 条目./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro 将本地文件./mongo-init.js 链接到容器路径/docker-entrypoint-initdb.d/mongo-init.js 作为只读ro。您可以在此处找到有关如何使用 volumes 的更多详细信息:docs.docker.com/storage/volumes
  • @GustavoSilva 我绝对确定它正在工作。看来您的 docker compose 文件和 js 脚本不在同一个文件夹中。或者你在windows上工作?然后请调整volumes 选项并将绝对路径添加到mongo-init.js 文件,例如c:\docker\mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
  • 什么是分贝?代码对我来说似乎不完整,是猫鼬连接吗?
  • 该示例正在运行且已完成。 db 是当前连接的数据库。创建容器后,mongo-init.js 脚本将在 mongo shell 环境中执行。
【解决方案2】:

/data/db 目录中没有任何内容时,docker hub mongo 映像将运行/docker-entrypoint-initdb.d/ 中的任何脚本。

数据库初始化

mongo 容器映像提供了/docker-entrypoint-initdb.d/ 路径来部署自定义.js.sh 设置脚本,这些脚本将在数据库初始化时运行一次。默认情况下,.js 脚本将针对 testMONGO_INITDB_DATABASE(如果在环境中定义)运行。

COPY mysetup.sh /docker-entrypoint-initdb.d/

COPY mysetup.js /docker-entrypoint-initdb.d/

一个简单的 mongo shell javascript 初始化文件,演示如何设置 container 集合,其中包含数据、日志记录以及如何在出现错误时退出(用于结果检查)。

let error = true

let res = [
  db.container.drop(),
  db.container.createIndex({ myfield: 1 }, { unique: true }),
  db.container.createIndex({ thatfield: 1 }),
  db.container.createIndex({ thatfield: 1 }),
  db.container.insert({ myfield: 'hello', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello2', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello3', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello3', thatfield: 'testing' })
]

printjson(res)

if (error) {
  print('Error, exiting')
  quit(1)
}

管理员用户设置

控制“root”用户设置的环境变量是

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

例子

docker run -d \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  mongod

Dockerfile

FROM docker.io/mongo
ENV MONGO_INITDB_ROOT_USERNAME admin
ENV MONGO_INITDB_ROOT_PASSWORD password

您不需要在命令行上使用--auth,因为 docker entrypoint.sh 脚本会在检测到环境变量存在时添加它。

【讨论】:

  • 这很好,我想set -e 告诉entrypoint.shENV 定义中读取变量,所以我可以使用与 MySQL 中的示例相同的方法,我是对的吗?作为对您的回答的补充,我确实发现 this PR 显然有人正在从事与您的提议类似的工作,只是从另一个角度来看
  • 默认获取的环境变量。 set -e 导致整个脚本在命令失败时退出,因此脚本不能静默失败并启动 mongo。
  • 类似于你看到的所有使用&amp;&amp;的Dockerfile构建脚本。
  • 那个 mongo PR 是一个更彻底的实现! docker-entrypoint-initdb.d 目录使其可扩展。我希望得到合并
  • 已合并(见here
【解决方案3】:

UPD 今天我avoid Docker Swarm、秘密和配置。我会用docker-compose.env 文件运行它。只要我不需要自动缩放。如果我这样做,我可能会选择k8s。还有数据库密码,是否是root帐户...当您在未连接到外部世界的容器中运行单个数据库时,它们真的很重要吗?...我想知道您对此有何看法,但是 Stack Overflow可能不太适合这种交流方式。

Mongo 镜像会受到MONGO_INITDB_DATABASEvariable 的影响,但它不会创建数据库。此变量在运行 /docker-entrypoint-initdb.d/* scripts 时确定当前数据库。由于您can't 在 Mongo 执行的脚本中使用环境变量,所以我使用了一个 shell 脚本:

docker-swarm.yml:

version: '3.1'

secrets:
  mongo-root-passwd:
    file: mongo-root-passwd
  mongo-user-passwd:
    file: mongo-user-passwd

services:
  mongo:
    image: mongo:3.2
    environment:
      MONGO_INITDB_ROOT_USERNAME: $MONGO_ROOT_USER
      MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongo-root-passwd
      MONGO_INITDB_USERNAME: $MONGO_USER
      MONGO_INITDB_PASSWORD_FILE: /run/secrets/mongo-user-passwd
      MONGO_INITDB_DATABASE: $MONGO_DB
    volumes:
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
    secrets:
      - mongo-root-passwd
      - mongo-user-passwd

init-mongo.sh:

mongo -- "$MONGO_INITDB_DATABASE" <<EOF
    var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
    var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
    var admin = db.getSiblingDB('admin');
    admin.auth(rootUser, rootPassword);

    var user = '$MONGO_INITDB_USERNAME';
    var passwd = '$(cat "$MONGO_INITDB_PASSWORD_FILE")';
    db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

或者,您可以将 init-mongo.sh 存储在配置中 (docker config create) 并使用:

configs:
    init-mongo.sh:
        external: true
...
services:
    mongo:
        ...
        configs:
            - source: init-mongo.sh
              target: /docker-entrypoint-initdb.d/init-mongo.sh

而且秘密不能存储在文件中。

couplegists 就此事。

【讨论】:

  • 我刚花了 3 个小时来寻找如何创建自己的数据库。疯狂的是,文档没有提到您需要在 .js 或 .sh 文件中进行身份验证。互联网上的示例根本不完整。你真的需要深入研究他们的 .sh 脚本来总结如何编写这些东西。容器启动时如何“创建空数据库”。应该为此创建 PR 以进行简化。如果你问我,有点疯狂。
  • 我花了几个小时寻找解决这个问题的方法。这只是救了我。谢谢。
  • $(cat "$MONGO_INITDB_ROOT_PASSWORD_FILE") 现在应该替换为 $MONGO_INITDB_ROOT_PASSWORD 因为 Mongo 图像已经为我们处理了秘密。 hub.docker.com/_/mongo
  • 3.2 也是如此。我可能没有注意到。
  • @x-yuri 对 init-mongo.sh 使用配置有什么好处,而不是仅仅将文件复制到 docker-entrypoint-initdb.d 并让它在那里自动运行?
【解决方案4】:

这是一个有效的解决方案,它使用密码、附加数据库 (test-database) 和该数据库中的 test-user 创建 admin-user 用户。

Dockerfile:

FROM mongo:4.0.3

ENV MONGO_INITDB_ROOT_USERNAME admin-user
ENV MONGO_INITDB_ROOT_PASSWORD admin-password
ENV MONGO_INITDB_DATABASE admin

ADD mongo-init.js /docker-entrypoint-initdb.d/

mongo-init.js:

db.auth('admin-user', 'admin-password')

db = db.getSiblingDB('test-database')

db.createUser({
  user: 'test-user',
  pwd: 'test-password',
  roles: [
    {
      role: 'root',
      db: 'test-database',
    },
  ],
});

棘手的部分是要了解 *.js 文件是在未经身份验证的情况下运行的。 该解决方案将脚本验证为admin 数据库中的admin-userMONGO_INITDB_DATABASE admin 是必不可少的,否则脚本将针对 test 数据库执行。查看docker-entrypoint.sh的源码。

【讨论】:

  • 角色有错别字吗? db 应该是测试数据库?
  • 第二行的两个 cmets 具有 getSiblingDB。首先,没有这条线,我的测试一切正常。其次,像这样覆盖 db 变量似乎是一种不好的形式,因为它被认为是一个全局对象,并且覆盖它会改变所有内容的上下文。
【解决方案5】:

如果有人正在寻找如何使用docker-compose 配置 MongoDB 进行身份验证,这里是使用环境变量的示例配置:

version: "3.3"

services:

  db:
      image: mongo
      environment:
        - MONGO_INITDB_ROOT_USERNAME=admin
        - MONGO_INITDB_ROOT_PASSWORD=<YOUR_PASSWORD>
      ports:
        - "27017:27017"

当运行docker-compose up 时,您的 mongo 实例会在启用身份验证的情况下自动运行。您将拥有一个具有给定密码的管理员数据库。

【讨论】:

  • mongo --username admin --password password --host localhost --port 27017 我无法连接,因为日志显示用户和数据库已成功创建。错误:$ mongo --username admin --password password --host localhost --port 27017 MongoDB shell version v3.4.10 connecting to: mongodb://localhost:27017/ MongoDB server version: 3.6.5 WARNING: shell and server versions do not match 2018-06-07T13:05:09.022+0000 E QUERY [thread1] Error: Authentication failed. : DB.prototype._authOrThrow@src/mongo/shell/db.js:1461:20 @(auth):6:1 @(auth):1:2 exception: login failed
  • 您需要mongo admin --username ADMIN --password PASSWORT 才能连接到您的 mongo 实例。
  • 无法让它工作。 “找不到用户 admin@admin”。好像没有自动创建用户?
  • mongodb://root:example@localhost/my-db?authSource=admin
  • @TaraPrasadGurung 我遇到了这个问题,注意到我已经为数据库创建了一个卷,你必须删除这个卷以便容器创建一个新用户。
【解决方案6】:

这对我有用:

docker-compose.yaml

version: "3.8"

services:
  mongodb:
    image: mongo:3.6
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=hello
    volumes:
      - ./mongo-init/:/docker-entrypoint-initdb.d/:ro
    ports:
      - 27017:27017
      - 9229:9229

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8111:8081
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongodb
      - ME_CONFIG_MONGODB_ADMINUSERNAME=root
      - ME_CONFIG_MONGODB_ADMINPASSWORD=hello

./mongo-init/init.js

conn = new Mongo();
db = conn.getDB("MyDatabaseName");


db.myCollectionName.createIndex({ "address.zip": 1 }, { unique: false });

db.myCollectionName.insert({ "address": { "city": "Paris", "zip": "123" }, "name": "Mike", "phone": "1234" });
db.myCollectionName.insert({ "address": { "city": "Marsel", "zip": "321" }, "name": "Helga", "phone": "4321" });

通过http://localhost:8111/查看仪表盘:

【讨论】:

【解决方案7】:

鉴于此.env 文件:

DB_NAME=foo
DB_USER=bar
DB_PASSWORD=baz

还有这个mongo-init.sh 文件:

mongo --eval "db.auth('$MONGO_INITDB_ROOT_USERNAME', '$MONGO_INITDB_ROOT_PASSWORD'); db = db.getSiblingDB('$DB_NAME'); db.createUser({ user: '$DB_USER', pwd: '$DB_PASSWORD', roles: [{ role: 'readWrite', db: '$DB_NAME' }] });"

这个docker-compose.yml会创建admin数据库和admin用户,认证为admin用户,然后创建真实数据库并添加真实用户:

version: '3'

services:
#  app:
#    build: .
#    env_file: .env
#    environment:
#      DB_HOST: 'mongodb://mongodb'

  mongodb:
    image: mongo:4
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin-user
      MONGO_INITDB_ROOT_PASSWORD: admin-password
      DB_NAME: $DB_NAME
      DB_USER: $DB_USER
      DB_PASSWORD: $DB_PASSWORD
    ports:
      - 27017:27017
    volumes:
      - db-data:/data/db
      - ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh

volumes:
  db-data:

【讨论】:

    【解决方案8】:

    如果您希望从 docker-compose.yml 中删除用户名和密码,您可以使用 Docker Secrets,这是我的处理方法。

    version: '3.6'
    
    services:
      db:
        image: mongo:3
        container_name: mycontainer
      secrets:
        - MONGO_INITDB_ROOT_USERNAME
        - MONGO_INITDB_ROOT_PASSWORD
      environment:
        - MONGO_INITDB_ROOT_USERNAME_FILE=/var/run/secrets/MONGO_INITDB_ROOT_USERNAME
        - MONGO_INITDB_ROOT_PASSWORD_FILE=/var/run/secrets/MONGO_INITDB_ROOT_PASSWORD
    secrets:
      MONGO_INITDB_ROOT_USERNAME:
        file:  secrets/${NODE_ENV}_mongo_root_username.txt
      MONGO_INITDB_ROOT_PASSWORD:
        file:  secrets/${NODE_ENV}_mongo_root_password.txt
    

    我已使用 file: 选项作为我的秘密,但是,您也可以使用 external: 并在群中使用秘密。

    这些秘密可用于容器中 /var/run/secrets 中的任何脚本

    Docker 文档对存储敏感数据有这样的说法...

    https://docs.docker.com/engine/swarm/secrets/

    您可以使用机密来管理容器在运行时需要但您不想存储在映像或源代码管理中的任何敏感数据,例如:

    用户名和密码 TLS 证书和密钥 SSH 密钥 其他重要数据,例如数据库或内部服务器的名称 通用字符串或二进制内容(最大 500 kb)

    【讨论】:

      【解决方案9】:

      这里只是对几个答案的快速补充 - 这一切都很棒,它确实为我节省了很多时间来解决问题! 如果您要创建的用户需要附加到特定数据库,我会添加一些 cod

      主要是您需要登录您的管理员基地才能创建新用户。因此,在提要中显示了所有 docker-compose.yml 后,您的 mongo-init.js 文件将如下所示:

      db = db.getSiblingDB('admin');
      // move to the admin db - always created in Mongo
      db.auth("rootUser", "rootPassword");
      // log as root admin if you decided to authenticate in your docker-compose file...
      db = db.getSiblingDB('DB_test');
      // create and move to your new database
      db.createUser({
      'user': "dbUser",
      'pwd': "dbPwd",
      'roles': [{
          'role': 'dbOwner',
          'db': 'DB_test'}]});
      // user created
      db.createCollection('collection_test');
      // add new collection
      

      如果这可以帮助某人,我很高兴 - 干杯,

      【讨论】:

      • 它帮助了我,谢谢伙计
      【解决方案10】:

      我的答案基于@x-yuri 提供的答案;但我的情况有点不同。我想要一个包含脚本的图像,而不是绑定而不需要绑定它。

      mongo-init.sh -- 不知道是否需要,但我也跑了chmod +x mongo-init.sh

      #!/bin/bash
      # https://stackoverflow.com/a/53522699
      # https://stackoverflow.com/a/37811764
      mongo -- "$MONGO_INITDB_DATABASE" <<EOF
        var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
        var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
        var user = '$MONGO_INITDB_USERNAME';
        var passwd = '$MONGO_INITDB_PASSWORD';
      
        var admin = db.getSiblingDB('admin');
      
        admin.auth(rootUser, rootPassword);
        db.createUser({
          user: user,
          pwd: passwd,
          roles: [
            {
              role: "root",
              db: "admin"
            }
          ]
        });
      EOF
      

      Dockerfile:

      FROM mongo:3.6
      
      COPY mongo-init.sh /docker-entrypoint-initdb.d/mongo-init.sh
      
      CMD [ "/docker-entrypoint-initdb.d/mongo-init.sh" ]
      

      docker-compose.yml:

      version: '3'
      
      services:
          mongodb:
              build: .
              container_name: mongodb-test
              environment:
                  - MONGO_INITDB_ROOT_USERNAME=root
                  - MONGO_INITDB_ROOT_PASSWORD=example
                  - MONGO_INITDB_USERNAME=myproject
                  - MONGO_INITDB_PASSWORD=myproject
                  - MONGO_INITDB_DATABASE=myproject
      
          myproject:
              image: myuser/myimage
              restart: on-failure
              container_name: myproject
              environment:
                  - DB_URI=mongodb
                  - DB_HOST=mongodb-test
                  - DB_NAME=myproject
                  - DB_USERNAME=myproject
                  - DB_PASSWORD=myproject
                  - DB_OPTIONS=
                  - DB_PORT=27017            
              ports:
                  - "80:80"
      

      之后,我继续将此 Dockefile 发布为图像以用于其他项目。

      注意:不添加 CMD mongo 会抛出:未绑定变量错误

      【讨论】:

        【解决方案11】:

        如果您正在使用 docker-compose 并在创建卷后尝试运行这些建议中的任何一个,您可能需要删除该卷,因为如果卷已经存在,则初始化脚本将不会运行。

        要查看是否是这种情况,请尝试运行:-

        docker volume ls

        如果您的 mongo 数据在那里,您应该在卷名中看到它,例如:-

        &lt;db&gt;_&lt;volume&gt;

        如果卷类似于 db_volume,则需要运行:-

        docker volume rm db_volume
        

        您可能需要丢弃您的容器才能使其正常工作。

        【讨论】:

          【解决方案12】:

          在没有root权限的MongoDB docker容器中创建多个数据库和用户的步骤

          1. 停止 docker-compose
            docker-compose down
            
            命令,如果您有多个文件,则为 'docker-compose -f docker-compose.yml -f docker-compose.dev.yml &lt;...&gt;'
          2. 删除分配给 mongo 容器的卷。运行'docker volume ls'。如果有类似&lt;projectfolder&gt;_mongodb--vol的东西,通过应用删除它
            docker volume rm <projectfolder>_mongodb--vol
            
          3. 使用.js.sh mongo 数据库init scripts 设置文件夹。例如mongo-init/db_1.js
            conn = new Mongo();
            db = conn.getDB("db_1")
            db.createUser(
            {
                user: "db_1_service_user",
                pwd: "<password>",
                roles: [
                    {
                        role: "readWrite",
                        db: "db_1"
                    }
                ]
            }
            );
            
            mongo-init/db_2.js 文件重复该过程。 conn.getDB() 创建数据库,db.createUser() 创建用户并将其分配给数据库。
          4. docker-compose.yml 片段,注意从包含数据库初始化脚本的本地文件夹./mongo-init/ 到远程/docker-entrypoint-initdb.d/ 的挂载绑定:
            version: "3.8"
            services:
            
              my-service_1:
                depends_on:
                  - mongodb
            
              my-service_2:
                depends_on:
                  - mongodb
            
              mongodb:
                image: mongo:4.4-bionic
                ports:
                - "27017:27017"
                volumes:
                - mongodb--vol:/data/db
                - ./mongo-init/:/docker-entrypoint-initdb.d/:ro
                healthcheck:
                test: "echo 'db.runCommand(\"ping\").ok'"
                interval: 5s
                timeout: 5s
                retries: 3
            
            # in-service volumes are very slow in MacOS and Windows, 
            # so using fast shared volumes for large storage
            volumes:
                mongodb--vol:
            
          5. 将连接字符串应用于您的应用程序:
            mongodb://db_1_service_user:<password>@mongodb:27017/db_1
            
            mongodb://db_2_service_user:<password>@mongodb:27017/db_2
            

          【讨论】:

            【解决方案13】:

            这就是我使用环境变量和秘密的方式。

            以下将在 mongo 容器启动时创建“app_user”和“app_database”(仅当 /data/db 中存储的已使用数据库为空时)。

            Dockerfile

            FROM mongo:5.0.3
            
            COPY images/mongo/init.js /docker-entrypoint-initdb.d/
            

            init.js

            db.log.insertOne({"message": "Database created."});
            
            db.createUser(
                {
                    user: _getEnv("MONGO_USER"),
                    pwd: cat(_getEnv("MONGO_PASSWORD_FILE")),
                    roles: [
                        "readWrite", "dbAdmin"
                    ]
                }
            );
            
            • 脚本将使用 MONGO_INITDB_DATABASE(在 docker-compose.yml 中定义的环境变量)作为数据库名称。
            • /docker-entrypoint-initdb.d/ 中的脚本仅在 /data/db 中存储的已使用数据库为空时才会运行。

            docker-compose.yml

            mongo:
              build:
                context: .
                dockerfile: ./images/mongo/Dockerfile
              container_name: app_mongo
              environment:
                MONGO_INITDB_DATABASE: "app_database"
                MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/app_mongo_root_password
                MONGO_INITDB_ROOT_USERNAME: "root"
                MONGO_PASSWORD_FILE: /run/secrets/app_mongo_password
                MONGO_USER: "app_user"
              secrets:
                - app_mongo_password
                - app_mongo_root_password
              volumes:
                - mongo:/data/db
            
            secrets:
              app_mongo_password:
                file: ./secrets/app_mongo_password.txt
              app_mongo_root_password:
                file: ./secrets/app_mongo_root_password.txt
            
            volumes:
              mongo:
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-09-16
              • 1970-01-01
              • 2019-12-23
              • 2021-07-12
              • 1970-01-01
              • 1970-01-01
              • 2018-07-26
              • 1970-01-01
              相关资源
              最近更新 更多