Мое приложение использует Minio для хранения объектов, совместимых с S3, и я хотел бы использовать образ док-станции Minio в моих интеграционных тестах через Testcontainers .
Для некоторых очень простых тестов я запускаю GenericContainer, используя образ докера minio/minio
и без конфигурации, кроме MINIO_ACCESS_KEY
и MINIO_SECRET_KEY
. Мои тесты затем используют Minio Java Client SDK . Они работают нормально и ведут себя так, как ожидалось.
Но для других интеграционных тестов мне нужно настроить отдельных пользователей в Mino. Насколько я вижу, пользователи могут быть добавлены в Minio только с помощью Admin API , для которого нет клиента Java, только образ докера minio/mc
(CLI mc
недоступен в minio/minio
образ докера, используемый для сервера).
В командной строке я могу использовать Admin API следующим образом:
$ docker run --interactive --tty --detach --entrypoint=/bin/sh --name minio_admin minio/mc
* * * * * * * * * * * * * * * * * * * * --interactive --tty
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1024* * * * * * * * * * * * * * * * * * * * * * * * * * * * *) * * * * * * * * * * * * * * * * * * * * * * * * * * будет "1010" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1023* * * * * * * * * * * * * * * * * * * * * * * * * * * * *1024* - это всего лишь взлом, чтобы поддерживать работу контейнера, так что я позже смогу выполнить такие команды:
$ 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
После долгих раздумий с этим у меня заканчиваются идеи. Кто-нибудь может помочь?