start-two-nodes-in-docker.sh 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. ## EMQX can only start with longname (https://erlang.org/doc/reference_manual/distributed.html)
  4. ## The host name part of EMQX's node name has to be static, this means we should either
  5. ## pre-assign static IP for containers, or ensure containers can communiate with each other by name
  6. ## this is why a docker network is created, and the containers's names have a dot.
  7. # ensure dir
  8. cd -P -- "$(dirname -- "$0")/.."
  9. IMAGE="${1}"
  10. NET='emqx.io'
  11. NODE1="node1.$NET"
  12. NODE2="node2.$NET"
  13. COOKIE='this-is-a-secret'
  14. ## clean up
  15. docker rm -f "$NODE1" >/dev/null 2>&1 || true
  16. docker rm -f "$NODE2" >/dev/null 2>&1 || true
  17. docker network rm "$NET" >/dev/null 2>&1 || true
  18. docker network create "$NET"
  19. docker run -d -t --restart=always --name "$NODE1" \
  20. --net "$NET" \
  21. -e EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug \
  22. -e EMQX_NODE_NAME="emqx@$NODE1" \
  23. -e EMQX_NODE_COOKIE="$COOKIE" \
  24. -e EMQX_CLUSTER__PROTO_DIST='inet_tls' \
  25. -p 18083:18083 \
  26. "$IMAGE"
  27. docker run -d -t --restart=always --name "$NODE2" \
  28. --net "$NET" \
  29. -e EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug \
  30. -e EMQX_NODE_NAME="emqx@$NODE2" \
  31. -e EMQX_NODE_COOKIE="$COOKIE" \
  32. -e EMQX_CLUSTER__PROTO_DIST='inet_tls' \
  33. -p 18084:18083 \
  34. "$IMAGE"
  35. wait () {
  36. container="$1"
  37. while ! docker exec "$container" emqx_ctl status >/dev/null 2>&1; do
  38. echo -n '.'
  39. sleep 1
  40. done
  41. }
  42. wait $NODE1
  43. wait $NODE2
  44. echo
  45. docker exec $NODE1 emqx_ctl cluster join "emqx@$NODE2"