From 9bb5abf44ae151a4f3d1141d4cc7a5fbac3b4c2f Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Fri, 24 Feb 2023 15:29:20 +0100 Subject: [PATCH] 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. --- changes/ce/fix-10027.en.md | 2 ++ changes/ce/fix-10027.zh.md | 2 ++ deploy/docker/README.md | 46 ++++++++++++------------------ deploy/docker/docker-entrypoint.sh | 45 +++++++++++++++-------------- 4 files changed, 46 insertions(+), 49 deletions(-) create mode 100644 changes/ce/fix-10027.en.md create mode 100644 changes/ce/fix-10027.zh.md diff --git a/changes/ce/fix-10027.en.md b/changes/ce/fix-10027.en.md new file mode 100644 index 000000000..531da1c50 --- /dev/null +++ b/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. diff --git a/changes/ce/fix-10027.zh.md b/changes/ce/fix-10027.zh.md new file mode 100644 index 000000000..ee7055d6c --- /dev/null +++ b/changes/ce/fix-10027.zh.md @@ -0,0 +1,2 @@ +在 docker 中启动时,允许使用 `EMQX_NODE__NAME` 环境变量来配置节点名。 +在此修复前,只能使 `EMQX_NODE_NAME`。 diff --git a/deploy/docker/README.md b/deploy/docker/README.md index e6067a203..edd29ae75 100644 --- a/deploy/docker/README.md +++ b/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`. -These environment variables are used during container startup phase only in [docker-entrypoint.sh](./docker-entrypoint.sh). +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. -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. +When running in docker, by default, `EMQX_NAME` and `EMQX_HOST` are resolved as below: + +| 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 diff --git a/deploy/docker/docker-entrypoint.sh b/deploy/docker/docker-entrypoint.sh index 1c18ef829..1824e1ee0 100755 --- a/deploy/docker/docker-entrypoint.sh +++ b/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