通过 Docker 使用 Firestore 模拟器的问题

问题描述 投票:0回答:1

我将 Firestore 模拟器作为 Docker 容器运行,并面临两个问题。 这是我正在使用的代码:


Environment.SetEnvironmentVariable("FIRESTORE_EMULATOR_HOST", "localhost:8080");

var builder = new FirestoreDbBuilder
{
    ProjectId = "default",
    EmulatorDetection = EmulatorDetection.EmulatorOrProduction
};
var firestoreDb = builder.Build();
    
var col = firestoreDb.Collection("Cities");
var docRef = col.Document("YVR");
var result = await docRef.SetAsync(new City { Name = "Vancouver", Population = 675_000 });
var doc = await docRef.GetSnapshotAsync();
doc.Exists.Dump();

var document = firestoreDb.Collection("Cities").Document("YVR");
var snapshot = await document.GetSnapshotAsync();
snapshot.Exists.Dump();
var city = snapshot.ConvertTo<City>();
city.Dump();

城市定义为:

[FirestoreData]
public class City
{
    [FirestoreDocumentId]
    public string Id { get; set; }

    [FirestoreProperty]
    public string Name { get; set; } = null!;

    [FirestoreProperty]
    public int Population { get; set; }
}

问题1

如果没有指定

ProjectId
,我会得到一个异常
ArgumentNullException
, 值不能为空。 (参数“项目ID”)。既然提供了
FIRESTORE_EMULATOR_HOST
环境变量,难道不应该将 null 值解析为模拟器吗?

如果使用模拟器,项目 ID 值应该是多少?

问题2

如果我为

ProjectId
设置值,代码可以工作,但在默认 URL
http://127.0.0.1:4000/firestore/data
处使用模拟器 UI 不会显示我要添加的文档。

c# google-cloud-firestore emulation firebase-tools
1个回答
0
投票

我将此答案发布为社区 wiki,以获得更好的社区可见性。

因为它与 ProjectId 耦合度很高。构建镜像并作为容器运行时,代码中使用的项目 ID 必须与镜像中的项目 ID 匹配。

根据您提出的

github issue
的讨论,当前的解决方法是:

使用

Docker
容器中的环境变量(然后可以在启动时传入)。我假设
Docker
图像使用(或可以使用)
--project
标志。如果您从环境变量中获取它,则可以在启动容器时将其传入,因此您只需要一个可以适用于任何项目的单个映像。您仍然需要在 .NET 代码中指定相同的项目 ID,但至少您不需要多个图像。

© www.soinside.com 2019 - 2024. All rights reserved.