001package io.ebean.docker.commands; 002 003import java.sql.Connection; 004import java.sql.SQLException; 005import java.util.ArrayList; 006import java.util.List; 007import java.util.Properties; 008 009public class ClickHouseContainer extends JdbcBaseDbContainer { 010 011 public static ClickHouseContainer create(String version, Properties properties) { 012 return new ClickHouseContainer(new ClickHouseConfig(version, properties)); 013 } 014 015 ClickHouseContainer(ClickHouseConfig config) { 016 super(config); 017 } 018 019 @Override 020 void createDatabase() { 021 createRoleAndDatabase(false); 022 } 023 024 @Override 025 void dropCreateDatabase() { 026 createRoleAndDatabase(true); 027 } 028 029 private void createRoleAndDatabase(boolean withDrop) { 030 try (Connection connection = config.createAdminConnection()) { 031 if (withDrop) { 032 dropDatabase(connection); 033 } 034 createDatabase(connection); 035 036 } catch (SQLException e) { 037 throw new RuntimeException("Error when creating database and role", e); 038 } 039 } 040 041 private void dropDatabase(Connection connection) { 042 sqlRun(connection, "drop database if exists " + dbConfig.getDbName()); 043 } 044 045 private void createDatabase(Connection connection) { 046 sqlRun(connection, "create database if not exists " + dbConfig.getDbName()); 047 } 048 049 @Override 050 protected ProcessBuilder runProcess() { 051 052 //$ docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 yandex/clickhouse-server 053 054 List<String> args = new ArrayList<>(); 055 args.add(config.docker); 056 args.add("run"); 057 args.add("-d"); 058 args.add("--name"); 059 args.add(config.containerName()); 060 args.add("--ulimit"); 061 args.add("nofile=262144:262144"); 062 063 args.add("-p"); 064 args.add(config.getPort() + ":" + config.getInternalPort()); 065 //8123 port for HTTP interface and 9000 port for native client. 066 067 args.add(config.getImage()); 068 ProcessBuilder pb = createProcessBuilder(args); 069 pb.redirectErrorStream(true); 070 return pb; 071 } 072 073}