diff options
author | Badlop <badlop@process-one.net> | 2022-05-31 13:35:15 +0200 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2022-09-13 17:55:17 +0200 |
commit | 5ee1dc9e8d80d52ec9f3dd3f043dfdd4c90c303a (patch) | |
tree | 6fca595c16d44cccddc0f77d20624b01d01c4428 | |
parent | Support ERL_DIST_PORT option to work without epmd (diff) |
Container: Support ERL_DIST_PORT
-rw-r--r-- | .github/container/Dockerfile | 2 | ||||
-rwxr-xr-x | .github/container/ejabberdctl.template | 16 | ||||
-rw-r--r-- | CONTAINER.md | 18 |
3 files changed, 35 insertions, 1 deletions
diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile index 541dabd66..a60446c32 100644 --- a/.github/container/Dockerfile +++ b/.github/container/Dockerfile @@ -113,7 +113,7 @@ HEALTHCHECK \ WORKDIR $HOME USER ejabberd VOLUME ["$HOME/conf", "$HOME/database", "$HOME/logs", "$HOME/upload"] -EXPOSE 1883 4369-4399 5222 5269 5280 5443 +EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443 ENTRYPOINT ["/usr/local/bin/ejabberdctl"] CMD ["foreground"] diff --git a/.github/container/ejabberdctl.template b/.github/container/ejabberdctl.template index 7ba20d68e..de3826a46 100755 --- a/.github/container/ejabberdctl.template +++ b/.github/container/ejabberdctl.template @@ -82,6 +82,7 @@ if [ -n "$INET_DIST_INTERFACE" ] ; then ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2" fi fi +[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -erl_epmd_port $ERL_DIST_PORT -start_epmd false" # if vm.args file exists in config directory, pass it to Erlang VM [ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS" ERL_LIBS='{{libdir}}' @@ -103,6 +104,7 @@ export EJABBERD_LOG_PATH export EJABBERD_PID_PATH export ERL_CRASH_DUMP export ERL_EPMD_ADDRESS +export ERL_DIST_PORT export ERL_INETRC export ERL_MAX_PORTS export ERL_MAX_ETS_TABLES @@ -111,6 +113,11 @@ export CONTRIB_MODULES_CONF_DIR export ERL_LIBS export SCRIPT_DIR +set_dist_client() +{ + [ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false" +} + # run command either directly or via su $INSTALLUSER run_cmd() { @@ -233,6 +240,7 @@ uid() # stop epmd if there is no other running node stop_epmd() { + [ -n "$ERL_DIST_PORT" ] && return "$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null } @@ -240,6 +248,7 @@ stop_epmd() # if all ok, ensure runtime directory exists and make it current directory check_start() { + [ -n "$ERL_DIST_PORT" ] && return "$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && { pgrep -f "$ERLANG_NODE" >/dev/null && { echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running." @@ -328,14 +337,17 @@ case $1 in ;; debug) debugwarning + set_dist_client exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE" ;; etop) + set_dist_client exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \ -s erlang halt -output text ;; iexdebug) debugwarning + set_dist_client exec_iex "$(uid debug)" --remsh "$ERLANG_NODE" ;; iexlive) @@ -345,20 +357,24 @@ case $1 in ping) PEER=${2:-$ERLANG_NODE} [ "$PEER" = "${PEER%.*}" ] && PS="-s" + set_dist_client exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \ -noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \ -s erlang halt -output text ;; started) + set_dist_client wait_status 0 30 2 # wait 30x2s before timeout ;; stopped) + set_dist_client wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout ;; post_waiter) post_waiter_waiting ;; *) + set_dist_client run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \ -extra "$ERLANG_NODE" $NO_TIMEOUT "$@" result=$? diff --git a/CONTAINER.md b/CONTAINER.md index 8f9c07ae8..d42a0ae6e 100644 --- a/CONTAINER.md +++ b/CONTAINER.md @@ -179,6 +179,7 @@ This container image exposes the ports: - `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH. - `1883`: Used for MQTT - `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering +- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD ### Volumes @@ -233,6 +234,23 @@ For this you can either: - edit `conf/ejabberdctl.cfg` and set variables `ERLANG_NODE` and `ERLANG_COOKIE` - set the environment variables `ERLANG_NODE_ARG` and `ERLANG_COOKIE` +Example to connect a local `ejabberdctl` to a containerized ejabberd: +1. When creating the container, export port 5210, and set `ERLANG_COOKIE`: +``` +docker run --name ejabberd -it \ + -e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \ + -p 5210:5210 -p 5222:5222 \ + ghcr.io/processone/ejabberd +``` +2. Set `ERL_DIST_PORT=5210` in ejabberdctl.cfg of container and local ejabberd +3. Restart the container +4. Now use `ejabberdctl` in your local ejabberd deployment + +To connect using a local `ejabberd` script: +``` +ERL_DIST_PORT=5210 _build/dev/rel/ejabberd/bin/ejabberd ping +``` + Example using environment variables (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)): ```yaml environment: |