我有一个在 Junit 4 测试中创建 Oryd/Hydra 容器的测试容器。
@Bean
public GenericContainer hydra() {
WaitStrategy waitStrategy = Wait.forHttp("/health/ready").forStatusCode(200);
GenericContainer hydra =
new GenericContainer("oryd/hydra:1.4.8")
.withCommand("serve all --dangerous-force-http")
.withEnv("URLS_SELF_ISSUER", "http://127.0.0.1:4444/")
.withEnv("DSN", "memory")
.withEnv("SECRETS_SYSTEM", "youReallyNeedToChangeThis")
.withEnv("OIDC_SUBJECT_IDENTIFIERS_SUPPORTED_TYPES", "public,pairwise")
.withEnv("OIDC_SUBJECT_IDENTIFIERS_PAIRWISE_SALT", "youReallyNeedToChangeThis")
.withEnv("STRATEGIES_ACCESS_TOKEN", "jwt")
.withEnv("OIDC_SUBJECT_IDENTIFIERS_SUPPORTED_TYPES", "public")
.withEnv("URLS_CONSENT", "http://127.0.0.1:3000/consent")
.withEnv("URLS_LOGIN", "http://127.0.0.1:3000/login")
.withExposedPorts(4444, 4445)
.waitingFor(waitStrategy)
.withNetwork(network)
.withLogConsumer(consumer);
hydra.start();
return hydra;
}
问题出在环境变量“URLS_SELF_ISSUER”上。Hydra 服务器的客户端验证服务器的 URL 是否与“URLS_SELF_ISSUER”的值匹配。它的值应该与暴露给它的客户端的 URL 匹配,但是 testcontainers 将暴露的端口 4444 绑定到一个随机端口。因此,URL 几乎总是与 127.0.0.1:4444 不同。
这是一个先有鸡还是先有蛋的问题。直到容器启动后我才知道端口是什么,然后更新变量为时已晚。
有没有办法知道暴露的端口,所以我可以用正确的 URL 配置容器变量“URLS_SELF_ISSUER”?