Skip to content

Commit bb2c737

Browse files
branch-3.0: [feat](doris compose) Add extra hosts option for up command #51098 (#51183)
Cherry-picked from #51098 Co-authored-by: yujun <yujun@selectdb.com>
1 parent 3fa7768 commit bb2c737

File tree

5 files changed

+82
-20
lines changed

5 files changed

+82
-20
lines changed

docker/runtime/doris-compose/Dockerfile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,14 @@
2222
# docker build -f docker/runtime/doris-compose/Dockerfile -t <your-image-name>:<version> .
2323

2424
# choose a base image
25+
# doris 2.1, 3.0+, master use JDK 17
2526
ARG JDK_IMAGE=openjdk:17-jdk-slim
27+
28+
# doris 2.0 use JDK 8
29+
# build 2.0 image, example:
30+
# docker build --build-arg JDK_IMAGE=openjdk:8u342-jdk \
31+
# -f docker/runtime/doris-compose/Dockerfile \
32+
# -t <your-image-name>:<version> .
2633
#ARG JDK_IMAGE=openjdk:8u342-jdk
2734

2835
# user can download a doris release package, extract it, then build its image used arg `OUTPUT_PATH`
@@ -48,7 +55,7 @@ FROM ${JDK_IMAGE}
4855
# set environment variables
4956
ENV JACOCO_VERSION=0.8.8
5057

51-
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
58+
RUN sed -i -e s@/deb.debian.org/@/mirrors.aliyun.com/@g -e s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
5259
&& apt-get clean \
5360
&& apt-get update \
5461
&& apt-get install -y --no-install-recommends \

docker/runtime/doris-compose/Readme.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,39 @@ If build doris use `sh build.sh --fe --be --cloud` **without do any change on th
4949
docker build -f docker/runtime/doris-compose/Dockerfile -t <image> .
5050
```
5151

52+
The Dockerfile default use JDK 17, for doris 2.1, 3.0, master, they all default use JDK 17.
53+
54+
But doris 2.0 still use JDK 8, for build 2.0 image, user need specific use JDK 8 with arg `JDK_IMAGE=openjdk:8u342-jdk`. Here is build 2.0 image command:
55+
56+
57+
```shell
58+
docker build -f docker/runtime/doris-compose/Dockerfile \
59+
--build-arg JDK_IMAGE=openjdk:8u342-jdk \
60+
-t <image> .
61+
```
62+
63+
5264
The `<image>` is the name you want the docker image to have.
5365

66+
User can also download a doris release package from [Doris Home](https://doris.apache.org/docs/releasenotes/all-release) or [Doris Github](https://github.com/apache/doris/releases), extract it, then build its image with arg `OUTPUT_PATH`
67+
68+
for example:
69+
70+
```shell
71+
cd ~/tmp
72+
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-3.0.5-bin-x64.tar.gz
73+
tar xvf apache-doris-3.0.5-bin-x64.tar.gz # after extract, there will be a directory ./apache-doris-3.0.5-bin-x64/{fe, be, ms}
74+
75+
# -f: the Dockerfile file
76+
# -t: the builded image
77+
# . : current directory, here it's ~/tmp, then output path is ~/tmp/apache-doris-3.0.5-bin-x64
78+
docker build \
79+
--build-arg OUTPUT_PATH=./apache-doris-3.0.5-bin-x64 \
80+
-f ~/workspace/doris/docker/runtime/doris-compose/Dockerfile \
81+
-t my-doris:v3.0.5 \
82+
.
83+
```
84+
5485
### 3. Install the dependent python library in 'docker/runtime/doris-compose/requirements.txt'
5586

5687
`PyYAML` of certain version not always fit other libraries' requirements. So we suggest to use a individual environment using `venv` or `conda`.

docker/runtime/doris-compose/cluster.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ def gen_subnet_prefix16():
145145

146146

147147
def get_master_fe_endpoint(cluster_name, wait_master_fe_query_addr_file=False):
148-
cluster_path = get_cluster_path(cluster_name)
149-
if os.path.exists(cluster_path):
148+
if os.path.exists(Cluster._get_meta_file(cluster_name)):
150149
master_fe_query_addr_file = get_master_fe_addr_path(cluster_name)
151150
max_retries = 10 if wait_master_fe_query_addr_file else 0
152151
i = 0
@@ -464,6 +463,7 @@ def compose(self):
464463
"volumes": volumes,
465464
}
466465

466+
extra_hosts = []
467467
if self.cluster.is_host_network():
468468
content["network_mode"] = "host"
469469
else:
@@ -473,11 +473,16 @@ def compose(self):
473473
"ipv4_address": self.get_ip(),
474474
}
475475
}
476-
content["extra_hosts"] = [
476+
extra_hosts.extend([
477477
"{}:{}".format(node.get_name(), node.get_ip())
478478
for node in self.cluster.get_all_nodes()
479-
]
479+
])
480480
content["ports"] = self.docker_ports()
481+
user_hosts = getattr(self.cluster, "extra_hosts", [])
482+
if user_hosts:
483+
extra_hosts.extend(user_hosts)
484+
if extra_hosts:
485+
content["extra_hosts"] = extra_hosts
481486

482487
if self.entrypoint():
483488
content["entrypoint"] = self.entrypoint()
@@ -780,8 +785,8 @@ class Cluster(object):
780785
def __init__(self, name, subnet, image, is_cloud, is_root_user, fe_config,
781786
be_config, ms_config, recycle_config, remote_master_fe,
782787
local_network_ip, fe_follower, be_disks, be_cluster, reg_be,
783-
coverage_dir, cloud_store_config, sql_mode_node_mgr,
784-
be_metaservice_endpoint, be_cluster_id):
788+
extra_hosts, coverage_dir, cloud_store_config,
789+
sql_mode_node_mgr, be_metaservice_endpoint, be_cluster_id):
785790
self.name = name
786791
self.subnet = subnet
787792
self.image = image
@@ -797,6 +802,7 @@ def __init__(self, name, subnet, image, is_cloud, is_root_user, fe_config,
797802
self.be_disks = be_disks
798803
self.be_cluster = be_cluster
799804
self.reg_be = reg_be
805+
self.extra_hosts = extra_hosts
800806
self.coverage_dir = coverage_dir
801807
self.cloud_store_config = cloud_store_config
802808
self.groups = {
@@ -813,9 +819,9 @@ def __init__(self, name, subnet, image, is_cloud, is_root_user, fe_config,
813819
@staticmethod
814820
def new(name, image, is_cloud, is_root_user, fe_config, be_config,
815821
ms_config, recycle_config, remote_master_fe, local_network_ip,
816-
fe_follower, be_disks, be_cluster, reg_be, coverage_dir,
817-
cloud_store_config, sql_mode_node_mgr, be_metaservice_endpoint,
818-
be_cluster_id):
822+
fe_follower, be_disks, be_cluster, reg_be, extra_hosts,
823+
coverage_dir, cloud_store_config, sql_mode_node_mgr,
824+
be_metaservice_endpoint, be_cluster_id):
819825
if not os.path.exists(LOCAL_DORIS_PATH):
820826
os.makedirs(LOCAL_DORIS_PATH, exist_ok=True)
821827
os.chmod(LOCAL_DORIS_PATH, 0o777)
@@ -827,9 +833,10 @@ def new(name, image, is_cloud, is_root_user, fe_config, be_config,
827833
cluster = Cluster(name, subnet, image, is_cloud, is_root_user,
828834
fe_config, be_config, ms_config, recycle_config,
829835
remote_master_fe, local_network_ip, fe_follower,
830-
be_disks, be_cluster, reg_be, coverage_dir,
831-
cloud_store_config, sql_mode_node_mgr,
832-
be_metaservice_endpoint, be_cluster_id)
836+
be_disks, be_cluster, reg_be, extra_hosts,
837+
coverage_dir, cloud_store_config,
838+
sql_mode_node_mgr, be_metaservice_endpoint,
839+
be_cluster_id)
833840
os.makedirs(cluster.get_path(), exist_ok=True)
834841
os.makedirs(get_status_path(name), exist_ok=True)
835842
cluster._save_meta()
@@ -860,7 +867,7 @@ def _get_meta_file(name):
860867
return os.path.join(get_cluster_path(name), "meta")
861868

862869
def is_host_network(self):
863-
return getattr(self, "remote_master_fe", "")
870+
return self.remote_master_fe
864871

865872
def get_remote_fe_node(self):
866873
if not self.is_host_network():

docker/runtime/doris-compose/command.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,14 @@ def add_parser(self, args_parsers):
430430
help="Recreate containers even if their configuration " \
431431
"and image haven't changed. ")
432432

433+
parser.add_argument(
434+
"--extra-hosts",
435+
nargs="*",
436+
type=str,
437+
help=
438+
"Add custom host-to-IP mappings (host:ip). For example: --extra-hosts myhost1:192.168.10.1 myhost2:192.168.10.2 . Only use when creating new cluster."
439+
)
440+
433441
parser.add_argument("--coverage-dir",
434442
default="",
435443
help="Set code coverage output directory")
@@ -599,8 +607,8 @@ def run(self, args):
599607
args.NAME, args.IMAGE, args.cloud, args.root, args.fe_config,
600608
args.be_config, args.ms_config, args.recycle_config,
601609
args.remote_master_fe, args.local_network_ip, args.fe_follower,
602-
args.be_disks, args.be_cluster, args.reg_be, args.coverage_dir,
603-
cloud_store_config, args.sql_mode_node_mgr,
610+
args.be_disks, args.be_cluster, args.reg_be, args.extra_hosts,
611+
args.coverage_dir, cloud_store_config, args.sql_mode_node_mgr,
604612
args.be_metaservice_endpoint, args.be_cluster_id)
605613
LOG.info("Create new cluster {} succ, cluster path is {}".format(
606614
args.NAME, cluster.get_path()))

regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class ClusterOptions {
5050
// for example, ' xx = yy ' is bad, should use 'xx=yy'
5151
List<String> feConfigs = [
5252
'heartbeat_interval_second=5',
53+
'workload_group_check_interval_ms=1000',
5354
]
5455

5556
// don't add whitespace in beConfigs items,
@@ -64,6 +65,10 @@ class ClusterOptions {
6465

6566
List<String> recycleConfigs = []
6667

68+
// host mapping(host:IP), for example: myhost:192.168.10.10
69+
// just as `docker run --add-host myhost:192.168.10.10` do.
70+
List<String> extraHosts = []
71+
6772
boolean connectToFollower = false
6873

6974
// 1. cloudMode = true, only create cloud cluster.
@@ -306,26 +311,30 @@ class SuiteCluster {
306311
cmd += ['--add-ms-num', String.valueOf(options.msNum)]
307312
}
308313
// TODO: need escape white space in config
309-
if (options.feConfigs != null && options.feConfigs.size() > 0) {
314+
if (!options.feConfigs.isEmpty()) {
310315
cmd += ['--fe-config']
311316
cmd += options.feConfigs
312317
}
313-
if (options.beConfigs != null && options.beConfigs.size() > 0) {
318+
if (!options.beConfigs.isEmpty()) {
314319
cmd += ['--be-config']
315320
cmd += options.beConfigs
316321
}
317-
if (options.msConfigs != null && options.msConfigs.size() > 0) {
322+
if (!options.msConfigs.isEmpty()) {
318323
cmd += ['--ms-config']
319324
cmd += options.msConfigs
320325
}
321-
if (options.recycleConfigs != null && options.recycleConfigs.size() > 0) {
326+
if (!options.recycleConfigs.isEmpty()) {
322327
cmd += ['--recycle-config']
323328
cmd += options.recycleConfigs
324329
}
325330
if (options.beDisks != null) {
326331
cmd += ['--be-disks']
327332
cmd += options.beDisks
328333
}
334+
if (!options.extraHosts.isEmpty()) {
335+
cmd += ['--extra-hosts']
336+
cmd += options.extraHosts
337+
}
329338
if (config.dockerCoverageOutputDir != null && config.dockerCoverageOutputDir != '') {
330339
cmd += ['--coverage-dir', config.dockerCoverageOutputDir]
331340
}

0 commit comments

Comments
 (0)