Просмотр исходного кода

fix(docker-entrypoint.sh): allow setting EMQX_NODE__NAME for docker

Prior to this change EMQX_NODE__NAME is ignored by docker entrypoint
script which will in turn set EQMX_NODE_NAME by resolving
the node name and domain name respectively.
Zaiming (Stone) Shi 2 лет назад
Родитель
Сommit
9bb5abf44a
4 измененных файлов с 46 добавлено и 49 удалено
  1. 2 0
      changes/ce/fix-10027.en.md
  2. 2 0
      changes/ce/fix-10027.zh.md
  3. 18 28
      deploy/docker/README.md
  4. 24 21
      deploy/docker/docker-entrypoint.sh

+ 2 - 0
changes/ce/fix-10027.en.md

@@ -0,0 +1,2 @@
+Allow setting node name from `EMQX_NODE__NAME` when running in docker.
+Prior to this fix, only `EMQX_NODE_NAME` is allowed.

+ 2 - 0
changes/ce/fix-10027.zh.md

@@ -0,0 +1,2 @@
+在 docker 中启动时,允许使用 `EMQX_NODE__NAME` 环境变量来配置节点名。
+在此修复前,只能使 `EMQX_NODE_NAME`。

+ 18 - 28
deploy/docker/README.md

@@ -50,48 +50,41 @@ The EMQX broker runs as Linux user `emqx` in the docker container.
 
 All EMQX Configuration in [`etc/emqx.conf`](https://github.com/emqx/emqx/blob/master/apps/emqx/etc/emqx.conf) can be configured via environment variables.
 
-By default, the environment variables with `EMQX_` prefix are mapped to key-value pairs in configuration files.
-
-You can change the prefix by overriding `HOCON_ENV_OVERRIDE_PREFIX`.
+The environment variables with `EMQX_` prefix are mapped to key-value pairs in configuration files.
 
 Example:
 
 ```bash
-EMQX_LISTENERS__SSL__DEFAULT__ACCEPTORS <--> listeners.ssl.default.acceptors
-EMQX_ZONES__DEFAULT__MQTT__MAX_PACKET_SIZE <--> zones.default.mqtt.max_packet_size
+EMQX_DASHBOARD__DEFAULT_PASSWORD       <--> dashboard.default_password
+EMQX_NODE__COOKIE                      <--> node.cookie
+EMQX_LISTENERS__SSL__default__ENABLE   <--> listeners.ssl.default.enable
 ```
 
 + Prefix `EMQX_` is removed
 + All upper case letters is replaced with lower case letters
 + `__` is replaced with `.`
 
-If `HOCON_ENV_OVERRIDE_PREFIX=DEV_` is set:
-
-```bash
-DEV_LISTENER__SSL__EXTERNAL__ACCEPTORS <--> listener.ssl.external.acceptors
-DEV_MQTT__MAX_PACKET_SIZE              <--> mqtt.max_packet_size
-DEV_LISTENERS__TCP__DEFAULT__BIND      <--> listeners.tcp.default.bind
-```
-
 For example, set MQTT TCP port to 1883
 
 ```console
-$ docker run -d --name emqx -e DEV_LISTENERS__TCP__DEFAULT__BIND=1883 -p 18083:18083 -p 1883:1883 emqx/emqx:latest
+$ docker run -d --name emqx -e EMQX_DASHBOARD__DEFAULT_PASSWORD=mysecret -p 18083:18083 -p 1883:1883 emqx/emqx:latest
 ```
 
-Please read more about EMQX configuration in the [official documentation](https://www.emqx.io/docs/en/v5.0/admin/cfg.html).
+Please read more about EMQX configuration in the [official documentation](https://www.emqx.io/docs/en/v5.0/configuration/configuration.html)
 
 #### EMQX node name configuration
 
-| Options                    | Default            | Mapped                    | Description                           |
-| ---------------------------| ------------------ | ------------------------- | ------------------------------------- |
-| `EMQX_NAME`                | container name     | none                      | EMQX node short name                  |
-| `EMQX_HOST`                | container IP       | none                      | EMQX node host, IP or FQDN            |
+A node name consists of two parts, `EMQX_NAME` part and `EMQX_HOST` part connected by a the symbol `@`. For example: `emqx@127.0.0.1`.
+
+Environment variables `EMQX_NODE_NAME` or `EMQX_NODE__NAME` can be used to set a EMQX node name.
+If neither of them is set, EMQX will resolve its node name from the running environment or other environment varialbes used for node discovery.
 
-These environment variables are used during container startup phase only in [docker-entrypoint.sh](./docker-entrypoint.sh).
+When running in docker, by default, `EMQX_NAME` and `EMQX_HOST` are resolved as below:
 
-If `EMQX_NAME` and `EMQX_HOST` are set, and `EMQX_NODE_NAME` is not set, `EMQX_NODE_NAME=$EMQX_NAME@$EMQX_HOST`.
-Otherwise `EMQX_NODE_NAME` is taken verbatim.
+| Options      | Default         | Description                  |
+| -------------| --------------- | -----------------------------|
+| `EMQX_NAME`  | container name  | EMQX node short name         |
+| `EMQX_HOST`  | container IP    | EMQX node host, IP or FQDN   |
 
 ### Cluster
 
@@ -108,8 +101,7 @@ Let's create a static node list cluster from docker-compose.
     emqx1:
       image: emqx/emqx:latest
       environment:
-      - "EMQX_NAME=emqx"
-      - "EMQX_HOST=node1.emqx.io"
+      - "EMQX_NODE_NAME=emqx@node1.emqx.io"
       - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
       - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]"
       networks:
@@ -120,8 +112,7 @@ Let's create a static node list cluster from docker-compose.
     emqx2:
       image: emqx/emqx:latest
       environment:
-      - "EMQX_NAME=emqx"
-      - "EMQX_HOST=node2.emqx.io"
+      - "EMQX_NODE_NAME=emqx@node2.emqx.io"
       - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
       - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]"
       networks:
@@ -174,8 +165,7 @@ services:
     image: emqx/emqx:latest
     restart: always
     environment:
-      EMQX_NAME: foo_emqx
-      EMQX_HOST: 127.0.0.1
+      EMQX_NODE_NAME: foo_emqx@127.0.0.1
     volumes:
       - vol-emqx-data:/opt/emqx/data
       - vol-emqx-etc:/opt/emqx/etc

+ 24 - 21
deploy/docker/docker-entrypoint.sh

@@ -18,28 +18,31 @@ LOCAL_IP=$(hostname -i | grep -oE '((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])\.){3}(
 
 export EMQX_NAME="${EMQX_NAME:-emqx}"
 
-if [[ -z "$EMQX_HOST" ]]; then
-    if [[ "$EMQX_CLUSTER__DISCOVERY_STRATEGY" == "dns" ]] && \
-        [[ "$EMQX_CLUSTER__DNS__RECORD_TYPE" == "srv" ]] && \
-        grep -q "$(hostname).$EMQX_CLUSTER__DNS__NAME" /etc/hosts; then
-            EMQX_HOST="$(hostname).$EMQX_CLUSTER__DNS__NAME"
-    elif [[ "$EMQX_CLUSTER__DISCOVERY_STRATEGY" == "k8s" ]] && \
-        [[ "$EMQX_CLUSTER__K8S__ADDRESS_TYPE" == "dns" ]] && \
-        [[ -n "$EMQX_CLUSTER__K8S__NAMESPACE" ]]; then
-            EMQX_CLUSTER__K8S__SUFFIX=${EMQX_CLUSTER__K8S__SUFFIX:-"pod.cluster.local"}
-            EMQX_HOST="${LOCAL_IP//./-}.$EMQX_CLUSTER__K8S__NAMESPACE.$EMQX_CLUSTER__K8S__SUFFIX"
-    elif [[ "$EMQX_CLUSTER__DISCOVERY_STRATEGY" == "k8s" ]] && \
-        [[ "$EMQX_CLUSTER__K8S__ADDRESS_TYPE" == 'hostname' ]] && \
-        [[ -n "$EMQX_CLUSTER__K8S__NAMESPACE" ]]; then
-            EMQX_CLUSTER__K8S__SUFFIX=${EMQX_CLUSTER__K8S__SUFFIX:-'svc.cluster.local'}
-            EMQX_HOST=$(grep -h "^$LOCAL_IP" /etc/hosts | grep -o "$(hostname).*.$EMQX_CLUSTER__K8S__NAMESPACE.$EMQX_CLUSTER__K8S__SUFFIX")
-    else
-        EMQX_HOST="$LOCAL_IP"
+## EMQX_NODE_NAME or EMQX_NODE__NAME to indicate the full node name to be used by EMQX
+## If both are set EMQX_NODE_NAME takes higher precedence than EMQX_NODE__NAME
+if [[ -z "${EMQX_NODE_NAME:-}" ]] && [[ -z "${EMQX_NODE__NAME:-}" ]]; then
+    # No node name is provide from environment variables
+    # try to resolve from other settings
+    if [[ -z "$EMQX_HOST" ]]; then
+        if [[ "$EMQX_CLUSTER__DISCOVERY_STRATEGY" == "dns" ]] && \
+            [[ "$EMQX_CLUSTER__DNS__RECORD_TYPE" == "srv" ]] && \
+            grep -q "$(hostname).$EMQX_CLUSTER__DNS__NAME" /etc/hosts; then
+                EMQX_HOST="$(hostname).$EMQX_CLUSTER__DNS__NAME"
+        elif [[ "$EMQX_CLUSTER__DISCOVERY_STRATEGY" == "k8s" ]] && \
+            [[ "$EMQX_CLUSTER__K8S__ADDRESS_TYPE" == "dns" ]] && \
+            [[ -n "$EMQX_CLUSTER__K8S__NAMESPACE" ]]; then
+                EMQX_CLUSTER__K8S__SUFFIX=${EMQX_CLUSTER__K8S__SUFFIX:-"pod.cluster.local"}
+                EMQX_HOST="${LOCAL_IP//./-}.$EMQX_CLUSTER__K8S__NAMESPACE.$EMQX_CLUSTER__K8S__SUFFIX"
+        elif [[ "$EMQX_CLUSTER__DISCOVERY_STRATEGY" == "k8s" ]] && \
+            [[ "$EMQX_CLUSTER__K8S__ADDRESS_TYPE" == 'hostname' ]] && \
+            [[ -n "$EMQX_CLUSTER__K8S__NAMESPACE" ]]; then
+                EMQX_CLUSTER__K8S__SUFFIX=${EMQX_CLUSTER__K8S__SUFFIX:-'svc.cluster.local'}
+                EMQX_HOST=$(grep -h "^$LOCAL_IP" /etc/hosts | grep -o "$(hostname).*.$EMQX_CLUSTER__K8S__NAMESPACE.$EMQX_CLUSTER__K8S__SUFFIX")
+        else
+            EMQX_HOST="$LOCAL_IP"
+        fi
+        export EMQX_HOST
     fi
-    export EMQX_HOST
-fi
-
-if [[ -z "$EMQX_NODE_NAME" ]]; then
     export EMQX_NODE_NAME="$EMQX_NAME@$EMQX_HOST"
 fi