我的应用程序使用Minio进行 S3 兼容的对象存储,我想通过 Testcontainers 在我的集成测试中使用Minio docker 映像。
minio/minio
对于一些非常基本的测试,我使用docker 映像运行 GenericContainer,除了MINIO_ACCESS_KEY
and之外没有任何配置MINIO_SECRET_KEY
。然后我的测试使用 Minio 的Java Client SDK。这些工作正常并且行为与预期一样。
但是对于其他集成测试,我需要在 Mino 中设置单独的用户。据我所知,用户只能使用Admin API添加到 Minio ,没有 Java 客户端,只有minio/mc
docker 镜像(用于服务器mc
的 docker 镜像中没有 CLI )。minio/minio
在命令行上,我可以像这样使用 Admin API:
$ docker run --interactive --tty --detach --entrypoint=/bin/sh --name minio_admin minio/mc
--interactive --tty
保持容器运行有点小技巧,所以我以后可以运行这样的命令:
$ docker exec --interactive --tty minio_admin mc admin user add ...
使用 Testcontainers,我尝试这样做:
public void testAdminApi() throws Exception {
GenericContainer mc = new GenericContainer("minio/mc")
.withCommand("/bin/sh")
.withCreateContainerCmdModifier(new Consumer<CreateContainerCmd>() {
@Override
public void accept(CreateContainerCmd cmd) {
cmd
.withAttachStdin(true)
.withStdinOpen(true)
.withTty(true);
}
});
mc.start();
log.info("mc is running: {}", mc.isRunning());
String command = "mc";
Container.ExecResult result = mc.execInContainer(command);
log.info("Executing command '{}' returned exit code '{}' and stdout '{}'", command, result.getExitCode(), result.getStdout());
assertEquals(0, result.getExitCode());
}
日志显示容器正在启动,但对其执行命令会返回退出代码 126 并声称它处于停止状态:
[minio/mc:latest] - Starting container with ID: 4f96fc7583fe62290925472c4c6b329fbeb7a55b38a3c0ad41ee797db1431841
[minio/mc:latest] - Container minio/mc:latest is starting: 4f96fc7583fe62290925472c4c6b329fbeb7a55b38a3c0ad41ee797db1431841
[minio/mc:latest] - Container minio/mc:latest started
minio.MinioAdminTests - mc is running: true
org.testcontainers.containers.ExecInContainerPattern - /kind_volhard: Running "exec" command: mc
minio.MinioAdminTests - Executing command 'mc' returned exit code '126'
and stdout 'cannot exec in a stopped state: unknown'
java.lang.AssertionError: Expected: 0, Actual: 126
在摆弄了几个小时之后,我的想法已经不多了。任何人都可以帮忙吗?