1
1
# ' Define default build variables
2
- # # specifc ARGs for METHOD='direct'
3
2
ARG OTP_VSN='27.2'
4
3
ARG ELIXIR_VSN='1.18.1'
5
- # # specifc ARGs for METHOD='package'
6
- ARG ALPINE_VSN='3.19'
7
- # # general ARGs
8
4
ARG UID='9000'
9
5
ARG USER='ejabberd'
10
6
ARG HOME="opt/$USER"
11
- ARG METHOD='direct'
12
7
ARG BUILD_DIR="/$USER"
13
8
ARG VERSION='master'
14
9
15
10
# ###############################################################################
16
- # ' METHOD='direct' - build and install ejabberd directly from source
17
- FROM docker.io/erlang:${OTP_VSN}-alpine AS direct
11
+ # ' Compile ejabberdapi
12
+ FROM docker.io/golang:1.23-alpine AS api
13
+ RUN go install -v \
14
+ github.com/processone/ejabberd-api/cmd/ejabberd@master \
15
+ && mv bin/ejabberd bin/ejabberdapi
16
+
17
+ # ###############################################################################
18
+ # ' build and install ejabberd directly from source
19
+ FROM docker.io/erlang:${OTP_VSN}-alpine AS ejabberd
18
20
19
21
RUN apk -U add --no-cache \
20
22
autoconf \
@@ -39,7 +41,8 @@ ARG ELIXIR_VSN
39
41
RUN wget -O - https://github.com/elixir-lang/elixir/archive/v$ELIXIR_VSN.tar.gz \
40
42
| tar -xzf -
41
43
42
- WORKDIR elixir-$ELIXIR_VSN
44
+ WORKDIR /elixir-$ELIXIR_VSN
45
+ ENV ERL_FLAGS="+JPperf true"
43
46
RUN make install clean
44
47
45
48
RUN mix local.hex --force \
@@ -50,6 +53,7 @@ COPY / $BUILD_DIR/
50
53
51
54
WORKDIR $BUILD_DIR
52
55
RUN mv .github/container/ejabberdctl.template . \
56
+ && mv .github/container/ejabberd.yml.example . \
53
57
&& ./autogen.sh \
54
58
&& ./configure --with-rebar=mix --enable-all \
55
59
&& make deps \
@@ -67,36 +71,18 @@ RUN cp -p $BUILD_DIR/tools/captcha*.sh $HOME-$VERSION/lib
67
71
RUN find "$HOME-$VERSION/bin" -name 'ejabberd' -delete \
68
72
&& find "$HOME-$VERSION/releases" -name 'COOKIE' -delete
69
73
70
- RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
71
- && sed -i '/^loglevel:/a \ \
72
- \n ca_file: /opt/ejabberd/conf/cacert.pem \
73
- \n certfiles: \
74
- \n - /opt/ejabberd/conf/server.pem' "$HOME/conf/ejabberd.yml"
75
-
76
- # ###############################################################################
77
- # ' METHOD='package' - install ejabberd from binary tarball package
78
- FROM docker.io/alpine:${ALPINE_VSN} AS package
79
- COPY tarballs/ejabberd-*-linux-musl-*.tar.gz /tmp/
80
- WORKDIR /rootfs
81
- ARG HOME
82
- RUN home_root_dir=$(echo $HOME | sed 's|\( .*\) /.*|\1 |' ) \
83
- && mkdir -p $home_root_dir \
84
- && ARCH=$(uname -m | sed -e 's/x86_64/x64/;s/aarch64/arm64/' ) \
85
- && tar -xzf /tmp/ejabberd-*-linux-musl-$ARCH.tar.gz -C $home_root_dir
74
+ RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem'
86
75
87
- # ###############################################################################
88
76
# ' Prepare ejabberd for runtime
89
- FROM ${METHOD} AS ejabberd
90
77
RUN apk -U add --no-cache \
91
78
git \
92
79
libcap \
93
80
openssl
94
81
95
- WORKDIR /rootfs
96
- ARG HOME
97
82
RUN mkdir -p usr/local/bin $HOME/conf $HOME/database $HOME/logs $HOME/upload
98
83
99
- ARG BUILD_DIR
84
+ COPY --from=api /go/bin/ejabberdapi usr/local/bin/
85
+
100
86
RUN if [ ! -d $HOME/.ejabberd-modules ]; \
101
87
then \
102
88
if [ -d $BUILD_DIR/.ejabberd-modules ]; \
@@ -116,11 +102,35 @@ RUN export PEM=$HOME/conf/server.pem \
116
102
-days 3650 \
117
103
-subj "/CN=localhost"
118
104
105
+ RUN sed -i 's|^#CTL_OVER_HTTP=|CTL_OVER_HTTP=../|' "$HOME/conf/ejabberdctl.cfg"
106
+
119
107
RUN home_root_dir=$(echo $HOME | sed 's|\( .*\) /.*|\1 |' ) \
120
108
&& setcap 'cap_net_bind_service=+ep' $(find $home_root_dir -name beam.smp) \
121
109
&& echo -e \
122
110
"#!/bin/sh \
123
111
\n [ -z \$ ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
112
+ \n export EMA=\"\$ EJABBERD_MACRO_ADMIN\" \
113
+ \n export HOST=\"\$ {EJABBERD_MACRO_HOST:-localhost}\" \
114
+ \n if [ -n \"\$ EMA\" ] \
115
+ \n then \
116
+ \n if [ \"\$ EMA\" != \"\$ {EMA%%@*}\" ] \
117
+ \n then \
118
+ \n export USERNAME=\"\$ {EMA%%@*}\" \
119
+ \n export HOST=\"\$ {EMA##*@}\" \
120
+ \n else \
121
+ \n export USERNAME=\"\$ EMA\" \
122
+ \n export SHOW_WARNING=\" true\" \
123
+ \n fi \
124
+ \n elif [ -n \"\$ REGISTER_ADMIN_PASSWORD\" ] \
125
+ \n then \
126
+ \n export USERNAME=\" admin\" \
127
+ \n else \
128
+ \n export USERNAME=\"\$ (od -A n -N 8 -t x8 /dev/urandom)\" \
129
+ \n fi \
130
+ \n export EJABBERD_MACRO_ADMIN=\"\$ USERNAME@\$ HOST\" \
131
+ \n [ -n \"\$ SHOW_WARNING\" ] && echo \" WARNING: The EJABBERD_MACRO_ADMIN environment variable was set to '\$ EMA', but it should include the host... I'll overwrite it to become '\$ EJABBERD_MACRO_ADMIN'.\" \
132
+ \n [ -n \"\$ CTL_ON_CREATE\" ] && export SEPARATOR=\" ;\" \
133
+ \n [ -n \"\$ REGISTER_ADMIN_PASSWORD\" ] && export CTL_ON_CREATE=\" register \$ {EJABBERD_MACRO_ADMIN%%@*} \$ {EJABBERD_MACRO_ADMIN##*@} \$ REGISTER_ADMIN_PASSWORD \$ SEPARATOR \$ CTL_ON_CREATE\" \
124
134
\n export CONFIG_DIR=/$HOME/conf \
125
135
\n export LOGS_DIR=/$HOME/logs \
126
136
\n export SPOOL_DIR=/$HOME/database \
@@ -137,28 +147,28 @@ RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
137
147
ARG UID
138
148
RUN chown -R $UID:$UID $HOME
139
149
150
+ RUN cp /rootfs/$HOME-$VERSION/lib/captcha*.sh usr/local/bin/
151
+ RUN mkdir $HOME/sql \
152
+ && find /rootfs/$HOME-$VERSION/lib/ -name *.sql -exec cp {} $HOME/sql \; -exec cp {} $HOME/database \;
153
+
140
154
# ###############################################################################
141
- # ' METHOD='direct' - Remove erlang/OTP & rebar3
142
- FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime-direct
155
+ # ' Remove erlang/OTP & rebar3
156
+ FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime
143
157
RUN apk del .erlang-rundeps \
144
158
&& rm -f $(which rebar3) \
145
159
&& find /usr -type d -name 'erlang' -exec rm -rf {} + \
146
160
&& find /usr -type l -exec test ! -e {} \; -delete
147
161
148
- # ###############################################################################
149
- # ' METHOD='package' - define runtime base image
150
- FROM docker.io/alpine:${ALPINE_VSN} AS runtime-package
151
-
152
- # ###############################################################################
153
162
# ' Update alpine, finalize runtime environment
154
- FROM runtime-${METHOD} AS runtime
155
163
COPY --from=ejabberd /tmp/runDeps /tmp/runDeps
156
164
RUN apk -U upgrade --available --no-cache \
157
165
&& apk add --no-cache \
158
166
$(cat /tmp/runDeps) \
159
167
so:libcap.so.2 \
160
168
so:libtdsodbc.so.0 \
169
+ curl \
161
170
tini \
171
+ && rm /tmp/runDeps \
162
172
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
163
173
164
174
ARG USER
@@ -167,9 +177,13 @@ ARG HOME
167
177
RUN addgroup $USER -g $UID \
168
178
&& adduser -s /sbin/nologin -D -u $UID -h /$HOME -G $USER $USER
169
179
180
+ RUN ln -fs /usr/local/bin/ /opt/ejabberd/bin
181
+ RUN rm -rf /home \
182
+ && ln -fs /opt /home
183
+
170
184
# ###############################################################################
171
185
# ' Build together production image
172
- FROM scratch AS prod
186
+ FROM scratch
173
187
ARG USER
174
188
ARG HOME
175
189
@@ -186,7 +200,7 @@ HEALTHCHECK \
186
200
WORKDIR /$HOME
187
201
USER $USER
188
202
VOLUME ["/$HOME" ]
189
- EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443
203
+ EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443
190
204
191
205
ENTRYPOINT ["/sbin/tini" ,"--" ,"ejabberdctl" ]
192
206
CMD ["foreground" ]
0 commit comments