如何连接到在Docker-compose上本地运行的CosmosDB模拟器

zazmityj  于 2022-12-18  发布在  Docker
关注(0)|答案(1)|浏览(90)

我试图通过docker-compose为CosmosDB模拟器运行一个linux容器,但我无法连接到它。
我有以下的docker-compose文件:

version: '3.4'
services:
  local-cosmosdb:
    image: "mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:mongodb"
    container_name: local.cosmosdb
    tty: true
    restart: always
    environment:
      - AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
      - AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true
    ports:
      - 8081:8081
      - 10250:10250
      - 10251:10251
      - 10252:10252
      - 10253:10253
      - 10254:10254
      - 10255:10255

当我启动容器时,控制台显示所有分区都成功启动了,并且正在运行。通过使用telnet,我还确认了 * 有 * 一些进程正在监听localhost上的端口,如10250和8081。但是,我无法使用连接字符串mongodb://localhost:8081连接到DB(MongoDB使用相同的字符串,但在端口27017上,我假设cosmos中有一个等价的字符串)。
我也试过:
1.使用暴露的任何其它端口(包括10250和10255)
1.尝试模拟器的不同标记
1.使用容器名称而不是本地主机与各种端口组合(例如mongodb://local.cosmosdb:8081
有关于通过连接字符串直接连接到Azure Cosmos DB的文档,但我找不到任何关于连接到Cosmos DB模拟器 * 在Docker compose上运行 * 的资源...我能找到的最好的是:CosmosDb Emulator with docker-compose,这并没有真正回答我的问题。我还遇到了这个问题:How to start CosmosDB emulator with docker-compose?,但它不包括获取实际的连接字符串。
任何帮助这将是非常感谢!

l2osamch

l2osamch1#

就像我在评论中提到的,微软似乎在急于修复the license issue时做了一些事情来破坏MongoDB API模拟器。
在更改之前,要通过MongoDB客户端连接到模拟器,您需要做的只是fetch the emulator certificate,然后用它初始化客户端,例如在Java中:

var storePassword = // whatever you used to create the keystore

var sslContext = new SSLContextBuilder()
        .loadKeyMaterial(keyStoreFile, storePassword, storePassword)
        .loadTrustMaterial(keyStoreFile, storePassword, TrustSelfSignedStrategy.INSTANCE)
        .setKeyStoreType("PKCS12")
        .build();

 var connectionUrl = "mongodb://localhost:" + URLEncoder.encode(EMULATOR_KEY, UTF_8) + "@localhost:10255/admin?ssl=true&retrywrites=false"

var clientSettings = MongoClientSettings.builder()
        .applyConnectionString(new ConnectionString(connectionUrl))
        .applyToSslSettings(builder -> builder.enabled(true)
                .invalidHostNameAllowed(true)
                .context(sslContext))
        .build();

MongoClients.create(clientSettings);

相关问题