This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 1509fbd538765d549d3cc5cad40e46e64ab90192
Author: FreeOnePlus <54164178+freeonep...@users.noreply.github.com>
AuthorDate: Mon Mar 11 19:09:52 2024 +0800

    [feature](docker)Doris On Docker All In One (#31735)
    
    * Refactor upgrade documentation
    
    * Doris On Docker All In One
    
    ---------
    
    Co-authored-by: Yijia Su <suyi...@selectdb.com>
---
 docker/runtime/all-in-one/Dockerfile              |  55 +++++
 docker/runtime/all-in-one/resource/entry_point.sh | 248 ++++++++++++++++++++++
 2 files changed, 303 insertions(+)

diff --git a/docker/runtime/all-in-one/Dockerfile 
b/docker/runtime/all-in-one/Dockerfile
new file mode 100644
index 00000000000..a7bcd98cfed
--- /dev/null
+++ b/docker/runtime/all-in-one/Dockerfile
@@ -0,0 +1,55 @@
+#!/bin/bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# how to use Dockerfile.
+# this is dockerfile for build doris fe image on amd64.
+# when build youself image.
+# 1. pull binary from official website and decompress into resource directory 
that the level equals with Dockerfile_be_ubuntu.
+# 2. untar xxxx.tar.gz in resource directory, update the dockerfile field 
`apache-doris-xxx`, replace with real version.
+# 3. run commad docker build -t xxx.doris.be:xx -f Dockerfile_be_ubuntu.
+
+# we have support buildx for amd64 and arm64 architecture image build.
+# get the binary from doris github and utar into resource, update the 
directory as apache-`version(example:2.0.1)`-bin-`architecture(amd64/arm64)` 
mode.
+
+# choose a base image
+FROM ubuntu:22.04
+
+ARG TARGETARCH
+
+RUN apt-get update -y &&  DEBIAN_FRONTEND=noninteractive apt-get install -y 
--no-install-recommends \
+    patchelf gdb binutils binutils-common mysql-client \
+    curl wget less vim htop iproute2 numactl jq iotop sysstat \
+    tcpdump iputils-ping dnsutils strace lsof blktrace tzdata \
+    bpfcc-tools linux-headers-realtime linux-tools-realtime silversearcher-ag \
+    net-tools openjdk-8-jdk && \
+    rm -rf /var/lib/apt/lists/*
+
+# set environment variables
+ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-${TARGETARCH:-amd64} \
+        
PATH="/opt/apache-doris/fe/bin:/opt/apache-doris/be/bin:/opt/apache-doris/broker/bin:${PATH}"
+
+# apache-doris/be from doris release xxxx.tar.gz.please update the version in 
follows x.x.x.
+ADD resource/apache-doris-x.x.x-bin-${TARGETARCH:-amd64}/fe 
/opt/apache-doris/fe
+ADD resource/apache-doris-x.x.x-bin-${TARGETARCH:-amd64}/be 
/opt/apache-doris/be
+ADD resource/apache-doris-x.x.x-bin-${TARGETARCH:-amd64}/broker 
/opt/apache-doris/broker
+
+COPY resource/entry_point.sh /usr/local/bin/
+
+WORKDIR /opt/apache-doris
+
+ENTRYPOINT ["bash","entry_point.sh"]
diff --git a/docker/runtime/all-in-one/resource/entry_point.sh 
b/docker/runtime/all-in-one/resource/entry_point.sh
new file mode 100644
index 00000000000..b0ec4882977
--- /dev/null
+++ b/docker/runtime/all-in-one/resource/entry_point.sh
@@ -0,0 +1,248 @@
+#!/bin/bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+set -eo pipefail
+shopt -s nullglob
+
+DORIS_HOME="/opt/apache-doris"
+
+# Obtain necessary and basic information to complete initialization
+
+# logging functions
+# usage: doris_[note|warn|error] $log_meg
+#    ie: doris_warn "task may be risky!"
+#   out: 2023-01-08T19:08:16+08:00 [Warn] [Entrypoint]: task may be risky!
+doris_log() {
+    local type="$1"
+    shift
+    # accept argument string or stdin
+    local text="$*"
+    if [ "$#" -eq 0 ]; then text="$(cat)"; fi
+    local dt="$(date -Iseconds)"
+    printf '%s [%s] [Entrypoint]: %s\n' "$dt" "$type" "$text"
+}
+doris_note() {
+    doris_log Note "$@"
+}
+doris_warn() {
+    doris_log Warn "$@" >&2
+}
+doris_error() {
+    doris_log ERROR "$@" >&2
+    exit 1
+}
+
+# check to see if this file is being run or sourced from another script
+_is_sourced() {
+    [ "${#FUNCNAME[@]}" -ge 2 ] &&
+        [ "${FUNCNAME[0]}" = '_is_sourced' ] &&
+        [ "${FUNCNAME[1]}" = 'source' ]
+}
+
+docker_setup_env() {
+    declare -g METADATA_FAILURE_RECOVERY MASTER_FE_IP CURRENT_BE_IP \
+               CURRENT_BE_PORT CURRENT_BROKER_IP CURRENT_BROKER_PORT 
DATABASE_ALREADY_EXISTS
+    MASTER_FE_IP="127.0.0.1"
+    CURRENT_BE_IP="127.0.0.1"
+    CURRENT_BE_PORT=9050
+    CURRENT_BROKER_IP="127.0.0.1"
+    CURRENT_BROKER_PORT=8000
+    if [[ $RECOVERY == "true" ]]; then
+        METADATA_FAILURE_RECOVERY='true'
+    fi
+    if [ -d "${DORIS_HOME}/fe/doris-meta/image" ]; then
+      DATABASE_ALREADY_EXISTS='true'
+    fi
+}
+
+# Execute sql script, passed via stdin
+docker_process_sql() {
+    set +e
+    mysql -uroot -P9030 -h127.0.0.1 --comments "$@" 2>&1
+}
+
+check_be_status() {
+  set +e
+  declare -g BE_ALREADY_EXISTS
+  for i in {1..300}; do
+    if [[ $1 == true ]]; then
+      docker_process_sql <<<"show frontends" | grep 
"[[:space:]]${MASTER_FE_IP}[[:space:]]"
+    else
+      docker_process_sql <<<"show backends" | grep 
"[[:space:]]${CURRENT_BE_IP}[[:space:]]" | grep 
"[[:space:]]${CURRENT_BE_PORT}[[:space:]]" | grep "[[:space:]]true[[:space:]]"
+    fi
+    be_join_status=$?
+    if [[ "${be_join_status}" == 0 ]]; then
+      if [[ $1 == true ]]; then
+        doris_note "MASTER FE is started!"
+      else
+        doris_note "EntryPoint Check - Verify that BE is registered to FE 
successfully"
+        BE_ALREADY_EXISTS=true
+      fi
+      return
+    fi
+    if [[ $(( $i % 20 )) == 1 ]]; then
+      if [[ $1 == true ]]; then
+        doris_note "MASTER FE is not started. retry."
+      else
+        doris_note "BE is not register. retry."
+      fi
+    fi
+    sleep 1
+  done
+}
+
+check_broker_status() {
+  set +e
+  declare -g BROKER_ALREADY_EXISTS
+  if [[ $1 == true ]]; then
+    docker_process_sql <<<"show broker" | grep 
"[[:space:]]${MASTER_FE_IP}[[:space:]]"
+  else
+    docker_process_sql <<<"show broker" | grep 
"[[:space:]]${CURRENT_BROKER_IP}[[:space:]]" | grep 
"[[:space:]]${CURRENT_BROKER_PORT}[[:space:]]" | grep 
"[[:space:]]true[[:space:]]"
+  fi
+  broker_join_status=$?
+  if [[ "${broker_join_status}" == 0 ]]; then
+    if [[ $1 == true ]]; then
+      doris_note "MASTER FE is started!"
+    else
+      doris_note "EntryPoint Check - Verify that Broker is registered to FE 
successfully"
+      BROKER_ALREADY_EXISTS=true
+    fi
+    return
+  fi
+  sleep 1
+}
+
+add_priority_networks() {
+  doris_note "add priority_networks ‘127.0.0.1/24’ to 
${DORIS_HOME}/be/conf/be.conf"
+  echo "priority_networks = 127.0.0.1/24" >>${DORIS_HOME}/be/conf/be.conf
+}
+
+register_be_to_fe() {
+  set +e
+  # check fe status
+  local is_fe_start=false
+  if [ -n "$DATABASE_ALREADY_EXISTS" ]; then
+    check_be_status
+    if [ -n "$BE_ALREADY_EXISTS" ]; then
+      doris_warn "Same backend already exists! No need to register again!"
+      return
+    fi
+  fi
+  for i in {1..300}; do
+    docker_process_sql <<<"alter system add backend 
'${CURRENT_BE_IP}:${CURRENT_BE_PORT}'"
+    register_be_status=$?
+    if [[ $register_be_status == 0 ]]; then
+      doris_note "BE successfully registered to FE!"
+      is_fe_start=true
+      return
+    fi
+    if [[ $(( $i % 20 )) == 1 ]]; then
+      doris_note "Register BE to FE is failed. retry."
+    fi
+    sleep 1
+  done
+  if ! [[ $is_fe_start ]]; then
+    doris_error "Failed to register BE to FE!Tried 30 times!Maybe FE Start 
Failed!"
+  fi
+}
+
+register_broker_to_fe() {
+  set +e
+  # check fe status
+  local is_fe_start=false
+  for i in {1..300}; do
+    if [ -n "$BROKER_ALREADY_EXISTS" ]; then
+      doris_warn "Same Broker already exists! No need to register again!"
+      break
+    fi
+    docker_process_sql <<<"alter system add broker test 
'${CURRENT_BROKER_IP}:${CURRENT_BROKER_PORT}'"
+    register_broker_status=$?
+    if [[ $register_broker_status == 0 ]]; then
+      doris_note "Broker successfully registered to FE!"
+      is_fe_start=true
+      break
+    fi
+    if [[ $(( $i % 20 )) == 1 ]]; then
+      doris_note "Register Broker to FE is failed. retry."
+    fi
+    sleep 1
+  done
+  if ! [[ $is_fe_start ]]; then
+    doris_error "Failed to register Broker to FE!Tried 30 times!Maybe FE Start 
Failed!"
+  fi
+}
+
+start_doris() {
+    declare -g child_pid
+    if [[ $METADATA_FAILURE_RECOVERY == "true" ]]; then
+        doris_warn "Because \$RECOVERY = True, So Doris FE start 
metadata_failure_recovery model."
+        start_fe.sh --metadata_failure_recovery --console
+    else
+        doris_note "Start Doris FE."
+        {
+            set +e
+            bash start_fe.sh --console 2>/dev/null
+        } &
+    fi
+    if [[ $BROKER = "true" ]]; then
+        sleep 20
+        {
+            set +e
+            bash start_broker.sh 2>/dev/null
+        } &
+        check_broker_status
+        register_broker_to_fe
+    fi
+    sleep 20
+    doris_note "Start Doris BE."
+    {
+        set +e
+        bash start_be.sh --console 2>/dev/null
+    } &
+    child_pid=$!
+}
+
+stop_doris() {
+    doris_note "Container stopped, running stop_fe & stop_be script"
+    stop_broker.sh
+    sleep 2
+    stop_be.sh
+    sleep 10
+    stop_fe.sh
+}
+
+_main() {
+    trap 'stop_doris' SIGTERM SIGINT
+    docker_setup_env
+    # Check Already Exists
+    if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
+      add_priority_networks
+    fi
+    # Start Doris
+    start_doris
+    # register BE
+    register_be_to_fe
+    # keep BE started status
+    wait $child_pid
+    doris_note "Apache Doris is Start Successfully!"
+    exec "$@"
+}
+
+if ! _is_sourced; then
+    _main "$@"
+fi


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to