Примеры
Пример 1. Запуск узла Tarantool 3.x
Шаг 1. Определение конфигурации Tarantool 3.x
Создадим конфигурационный файл config.yaml по произвольному пути (воспользуемся средствами
JUnit - @TempDir, для создания временной директории):
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.testcontainers.containers.tarantool.config.ConfigurationUtils;
import io.tarantool.autogen.Tarantool3Configuration;
import io.tarantool.autogen.credentials.Credentials;
import io.tarantool.autogen.credentials.users.Users;
import io.tarantool.autogen.credentials.users.usersProperty.UsersProperty;
import io.tarantool.autogen.groups.Groups;
import io.tarantool.autogen.groups.groupsProperty.GroupsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.Replicasets;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.ReplicasetsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.Instances;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.InstancesProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.Iproto;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.listen.Listen;
public class TestClass {
private static final String NODE = "test-node";
private static final CharSequence PWD = "secret";
private static final String LOGIN = "test-user";
@TempDir
private static Path tempDir;
@Test
public void test() throws IOException {
final Path pathToConfigFile = Files.createFile(tempDir.resolve("config.yaml"));
final Credentials credentials = Credentials.builder()
.withUsers(Users.builder()
.withAdditionalProperty(LOGIN, UsersProperty.builder()
.withRoles(Collections.singletonList("super"))
.withPassword(PWD.toString())
.build())
.build())
.build();
final Iproto iproto = Iproto.builder()
.withListen(List.of(Listen.builder().withUri("0.0.0.0:3301").build()))
.build();
final InstancesProperty instance = InstancesProperty.builder()
.withIproto(iproto).build();
final ReplicasetsProperty replicaset = ReplicasetsProperty.builder()
.withInstances(Instances.builder()
.withAdditionalProperty(NODE, instance)
.build())
.build();
final GroupsProperty group = GroupsProperty.builder()
.withReplicasets(Replicasets.builder()
.withAdditionalProperty("test-rs", replicaset)
.build())
.build();
final Tarantool3Configuration configuration = Tarantool3Configuration.builder()
.withGroups(Groups.builder()
.withAdditionalProperty("test-group", group)
.build())
.withCredentials(credentials)
.build();
ConfigurationUtils.writeToFile(configuration, pathToConfigFile);
}
}
В результате, получили конфигурационный файл по пути tmpDir/config.yaml со следующим содержимым:
---
credentials:
users:
test-user:
password: "secret"
roles:
- "super"
groups:
test-group:
replicasets:
test-rs:
instances:
test-node:
iproto:
listen:
- uri: "0.0.0.0:3301"
Шаг 2. Создание и запуск контейнера
Создание файла конфигурации из Шаг 1. Определение конфигурации Tarantool 3.x было вынесено в
отдельный метод:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import org.testcontainers.containers.tarantool.config.tarantool3.Tarantool3Configuration;
import org.testcontainers.containers.tarantool.config.tarantool3.credentials.Credentials;
import org.testcontainers.containers.tarantool.config.tarantool3.groups.Group;
import org.testcontainers.containers.tarantool.config.tarantool3.groups.Instance;
import org.testcontainers.containers.tarantool.config.tarantool3.groups.Replicaset;
import org.testcontainers.containers.tarantool.config.tarantool3.iproto.Listen;
public class TestClass {
private static final String NODE = "test-node";
private static final CharSequence PWD = "secret";
private static final String LOGIN = "test-user";
@TempDir
private static Path tempDir;
@Test
public void test() throws IOException {
final Path pathToConfigFile = createSimpleTestConfigFile(tempDir);
}
}
Создадим контейнер для Tarantool 3.4.1 и запустим его:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.testcontainers.containers.tarantool.Tarantool3Container;
import org.testcontainers.containers.tarantool.TarantoolContainer;
import org.testcontainers.containers.tarantool.config.ConfigurationUtils;
import org.testcontainers.utility.DockerImageName;
import io.tarantool.autogen.Tarantool3Configuration;
import io.tarantool.autogen.credentials.Credentials;
import io.tarantool.autogen.credentials.users.Users;
import io.tarantool.autogen.credentials.users.usersProperty.UsersProperty;
import io.tarantool.autogen.groups.Groups;
import io.tarantool.autogen.groups.groupsProperty.GroupsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.Replicasets;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.ReplicasetsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.Instances;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.InstancesProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.Iproto;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.listen.Listen;
public class TestClass {
private static final String NODE = "test-node";
private static final CharSequence PWD = "secret";
private static final String LOGIN = "test-user";
@TempDir
private static Path tempDir;
@Test
public void test() throws IOException, InterruptedException {
final Path pathToConfigFile = createSimpleTestConfigFile(tempDir);
final DockerImageName image = DockerImageName.parse("tarantool/tarantool:3.4.1");
// NODE должен соответствовать instance name в конфигурационном файле
try (TarantoolContainer<Tarantool3Container> container = new Tarantool3Container(image, NODE)
.withConfigPath(pathToConfigFile)) {
container.start();
final String COMMAND_FORMAT = "echo \"box.cfg.instance_name\" | tt connect %s:%s@localhost:3301 -x lua";
final String result = container.execInContainer("/bin/sh", "-c",
String.format(COMMAND_FORMAT, LOGIN, PWD)).getStdout();
Assertions.assertEquals("\"" + container.node() + "\";\n", result);
} // call container.stop()
}
private static Path createSimpleTestConfigFile(Path tempDir) throws IOException {
final Path pathToConfigFile = Files.createFile(tempDir.resolve("config.yaml"));
final Credentials credentials = Credentials.builder()
.withUsers(Users.builder()
.withAdditionalProperty(LOGIN, UsersProperty.builder()
.withRoles(Collections.singletonList("super"))
.withPassword(PWD.toString())
.build())
.build())
.build();
final Iproto iproto = Iproto.builder()
.withListen(List.of(Listen.builder().withUri("0.0.0.0:3301").build()))
.build();
final InstancesProperty instance = InstancesProperty.builder()
.withIproto(iproto).build();
final ReplicasetsProperty replicaset = ReplicasetsProperty.builder()
.withInstances(Instances.builder()
.withAdditionalProperty(NODE, instance)
.build())
.build();
final GroupsProperty group = GroupsProperty.builder()
.withReplicasets(Replicasets.builder()
.withAdditionalProperty("test-rs", replicaset)
.build())
.build();
final Tarantool3Configuration configuration = Tarantool3Configuration.builder()
.withGroups(Groups.builder()
.withAdditionalProperty("test-group", group)
.build())
.withCredentials(credentials)
.build();
ConfigurationUtils.writeToFile(configuration, pathToConfigFile);
return pathToConfigFile;
}
}
В результате работы вы получите аналогичные логи:
15:15:31.769 [main] INFO tc.tarantool/tarantool:3.4.1 - Creating container for image: tarantool/tarantool:3.4.1
15:15:32.185 [main] INFO tc.tarantool/tarantool:3.4.1 - Container tarantool/tarantool:3.4.1 is starting: eb542dfac096dead65b1f00e39f1926d4dfc8267dd0e8b3a7f4ecae62d02d306
15:15:32.382 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: started
15:15:32.395 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.364 [1] main/104/interactive main.cc:497 I> Tarantool 3.4.1-0-g0b3c0eb8c0b Linux-aarch64-RelWithDebInfo
15:15:32.395 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.364 [1] main/104/interactive main.cc:499 I> log level 5 (INFO)
15:15:32.395 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.364 [1] main/104/interactive gc.c:131 I> wal/engine cleanup is paused
15:15:32.396 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.365 [1] main/104/interactive tuple.c:411 I> mapping 268435456 bytes for memtx tuple arena...
15:15:32.396 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.365 [1] main/104/interactive memtx_engine.cc:1778 I> Actual slab_alloc_factor calculated on the basis of desired slab_alloc_factor = 1.044274
15:15:32.396 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.366 [1] main/104/interactive tuple.c:411 I> mapping 134217728 bytes for vinyl tuple arena...
15:15:32.401 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.370 [1] main/104/interactive box.cc:2471 I> update replication_synchro_quorum = 1
15:15:32.401 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.370 [1] main/104/interactive box.cc:3556 I> The option replication_synchro_queue_max_size will actually take effect after the recovery is finished
15:15:32.401 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.370 [1] main/104/interactive box.cc:5747 I> instance uuid 9a492c41-5ff0-453d-8c13-658af696c68a
15:15:32.401 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.371 [1] main/104/interactive evio.c:284 I> tx_binary: bound to 0.0.0.0:3301
15:15:32.401 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.371 [1] main/104/interactive memtx_engine.cc:734 I> initializing an empty data directory
15:15:32.417 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.387 [1] main/104/interactive replication.cc:576 I> assigned id 1 to replica 9a492c41-5ff0-453d-8c13-658af696c68a
15:15:32.417 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.387 [1] main/104/interactive replication.cc:594 I> assigned name test-node to replica 9a492c41-5ff0-453d-8c13-658af696c68a
15:15:32.417 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.387 [1] main/104/interactive box.cc:2471 I> update replication_synchro_quorum = 1
15:15:32.417 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.387 [1] main/104/interactive alter.cc:4210 I> replicaset uuid b4acbd1b-6f18-4270-b0b1-ecbf0f92534e
15:15:32.417 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.387 [1] main/104/interactive alter.cc:4223 I> replicaset name: test-rs
15:15:32.418 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.388 [1] snapshot/101/main memtx_engine.cc:1079 I> saving snapshot `/data/00000000000000000000.snap.inprogress'
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] snapshot/101/main memtx_engine.cc:1181 I> done
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive box.cc:682 I> leaving waiting_for_own_rows mode
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive box.cc:6262 I> ready to accept requests
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/107/gc gc.c:319 I> wal/engine cleanup is resumed
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'custom_proc_title' configuration option to "tarantool - test-node"
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'instance_name' configuration option to "test-node"
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'log_nonblock' configuration option to false
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'listen' configuration option to [{"uri":"0.0.0.0:3301"}]
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'replication' configuration option to []
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'replicaset_name' configuration option to "test-rs"
15:15:32.419 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'instance_uuid' configuration option to "9a492c41-5ff0-453d-8c13-658af696c68a"
15:15:32.420 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive/box.load_cfg load_cfg.lua:966 I> set 'metrics' configuration option to {"labels":{"alias":"test-node"},"include":["all"],"exclude":[]}
15:15:32.420 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/104/interactive box.cc:444 I> box switched to rw
15:15:32.420 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.389 [1] main/108/checkpoint_daemon gc.c:650 I> scheduled next checkpoint for Wed Aug 27 13:35:30 2025
15:15:32.421 [docker-java-stream-1077198046] INFO o.t.c.tarantool.Tarantool3Container - [test-node] STDERR: 2025-08-27 12:15:32.391 [1] main main.cc:1072 I> entering the event loop
15:15:32.451 [main] INFO tc.tarantool/tarantool:3.4.1 - Container tarantool/tarantool:3.4.1 started in PT0.682201S