@Bean(name = ZOOKEEPER_BEAN_NAME, destroyMethod = "stop")
public GenericContainer zookeeper(ZookeeperStatusCheck zookeeperStatusCheck,
ZookeeperConfigurationProperties zookeeperProperties,
ConfigurableEnvironment environment,
Network network) {
String currentTimestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH-mm-ss-nnnnnnnnn"));
String zkData = Paths.get(zookeeperProperties.getDataFileSystemBind(), currentTimestamp).toAbsolutePath().toString();
log.info("Writing zookeeper data to: {}", zkData);
String zkTransactionLogs = Paths.get(zookeeperProperties.getTxnLogsFileSystemBind(), currentTimestamp).toAbsolutePath().toString();
log.info("Writing zookeeper transaction logs to: {}", zkTransactionLogs);
log.info("Starting zookeeper server. Docker image: {}", zookeeperProperties.getDockerImage());
int mappingPort = zookeeperProperties.getZookeeperPort();
GenericContainer zookeeper = new FixedHostPortGenericContainer<>(zookeeperProperties.getDockerImage())
.withLogConsumer(containerLogsConsumer(log))
.withEnv("ZOOKEEPER_CLIENT_PORT", String.valueOf(mappingPort))
.withFileSystemBind(zkData, "/var/lib/zookeeper/data", BindMode.READ_WRITE)
.withFileSystemBind(zkTransactionLogs, "/var/lib/zookeeper/log", BindMode.READ_WRITE)
.withExposedPorts(mappingPort)
.withFixedExposedPort(mappingPort, mappingPort)
.withNetwork(network)
.withNetworkAliases(ZOOKEEPER_HOST_NAME)
.waitingFor(zookeeperStatusCheck)
.withStartupTimeout(zookeeperProperties.getTimeoutDuration());
zookeeper.start();
registerZookeeperEnvironment(zookeeper, environment, zookeeperProperties);
return zookeeper;
}