Skip to content

Commit 29616dc

Browse files
authored
Merge pull request #4340 from badlop/containers-frictionless
CTL_OVER_HTTP and containers frictionless
2 parents afc54ae + 60324d4 commit 29616dc

10 files changed

+926
-322
lines changed

Diff for: .github/container/Dockerfile

+53-39
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
#' Define default build variables
2-
## specifc ARGs for METHOD='direct'
32
ARG OTP_VSN='27.2'
43
ARG ELIXIR_VSN='1.18.1'
5-
## specifc ARGs for METHOD='package'
6-
ARG ALPINE_VSN='3.19'
7-
## general ARGs
84
ARG UID='9000'
95
ARG USER='ejabberd'
106
ARG HOME="opt/$USER"
11-
ARG METHOD='direct'
127
ARG BUILD_DIR="/$USER"
138
ARG VERSION='master'
149

1510
################################################################################
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
1820

1921
RUN apk -U add --no-cache \
2022
autoconf \
@@ -39,7 +41,8 @@ ARG ELIXIR_VSN
3941
RUN wget -O - https://github.com/elixir-lang/elixir/archive/v$ELIXIR_VSN.tar.gz \
4042
| tar -xzf -
4143

42-
WORKDIR elixir-$ELIXIR_VSN
44+
WORKDIR /elixir-$ELIXIR_VSN
45+
ENV ERL_FLAGS="+JPperf true"
4346
RUN make install clean
4447

4548
RUN mix local.hex --force \
@@ -50,6 +53,7 @@ COPY / $BUILD_DIR/
5053

5154
WORKDIR $BUILD_DIR
5255
RUN mv .github/container/ejabberdctl.template . \
56+
&& mv .github/container/ejabberd.yml.example . \
5357
&& ./autogen.sh \
5458
&& ./configure --with-rebar=mix --enable-all \
5559
&& make deps \
@@ -67,36 +71,18 @@ RUN cp -p $BUILD_DIR/tools/captcha*.sh $HOME-$VERSION/lib
6771
RUN find "$HOME-$VERSION/bin" -name 'ejabberd' -delete \
6872
&& find "$HOME-$VERSION/releases" -name 'COOKIE' -delete
6973

70-
RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
71-
&& sed -i '/^loglevel:/a \ \
72-
\nca_file: /opt/ejabberd/conf/cacert.pem \
73-
\ncertfiles: \
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'
8675

87-
################################################################################
8876
#' Prepare ejabberd for runtime
89-
FROM ${METHOD} AS ejabberd
9077
RUN apk -U add --no-cache \
9178
git \
9279
libcap \
9380
openssl
9481

95-
WORKDIR /rootfs
96-
ARG HOME
9782
RUN mkdir -p usr/local/bin $HOME/conf $HOME/database $HOME/logs $HOME/upload
9883

99-
ARG BUILD_DIR
84+
COPY --from=api /go/bin/ejabberdapi usr/local/bin/
85+
10086
RUN if [ ! -d $HOME/.ejabberd-modules ]; \
10187
then \
10288
if [ -d $BUILD_DIR/.ejabberd-modules ]; \
@@ -116,11 +102,35 @@ RUN export PEM=$HOME/conf/server.pem \
116102
-days 3650 \
117103
-subj "/CN=localhost"
118104

105+
RUN sed -i 's|^#CTL_OVER_HTTP=|CTL_OVER_HTTP=../|' "$HOME/conf/ejabberdctl.cfg"
106+
119107
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
120108
&& setcap 'cap_net_bind_service=+ep' $(find $home_root_dir -name beam.smp) \
121109
&& echo -e \
122110
"#!/bin/sh \
123111
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
112+
\nexport EMA=\"\$EJABBERD_MACRO_ADMIN\" \
113+
\nexport HOST=\"\${EJABBERD_MACRO_HOST:-localhost}\" \
114+
\nif [ -n \"\$EMA\" ] \
115+
\nthen \
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+
\nelif [ -n \"\$REGISTER_ADMIN_PASSWORD\" ] \
125+
\nthen \
126+
\n export USERNAME=\"admin\" \
127+
\nelse \
128+
\n export USERNAME=\"\$(od -A n -N 8 -t x8 /dev/urandom)\" \
129+
\nfi \
130+
\nexport 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\" \
124134
\nexport CONFIG_DIR=/$HOME/conf \
125135
\nexport LOGS_DIR=/$HOME/logs \
126136
\nexport SPOOL_DIR=/$HOME/database \
@@ -137,28 +147,28 @@ RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
137147
ARG UID
138148
RUN chown -R $UID:$UID $HOME
139149

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+
140154
################################################################################
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
143157
RUN apk del .erlang-rundeps \
144158
&& rm -f $(which rebar3) \
145159
&& find /usr -type d -name 'erlang' -exec rm -rf {} + \
146160
&& find /usr -type l -exec test ! -e {} \; -delete
147161

148-
################################################################################
149-
#' METHOD='package' - define runtime base image
150-
FROM docker.io/alpine:${ALPINE_VSN} AS runtime-package
151-
152-
################################################################################
153162
#' Update alpine, finalize runtime environment
154-
FROM runtime-${METHOD} AS runtime
155163
COPY --from=ejabberd /tmp/runDeps /tmp/runDeps
156164
RUN apk -U upgrade --available --no-cache \
157165
&& apk add --no-cache \
158166
$(cat /tmp/runDeps) \
159167
so:libcap.so.2 \
160168
so:libtdsodbc.so.0 \
169+
curl \
161170
tini \
171+
&& rm /tmp/runDeps \
162172
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
163173

164174
ARG USER
@@ -167,9 +177,13 @@ ARG HOME
167177
RUN addgroup $USER -g $UID \
168178
&& adduser -s /sbin/nologin -D -u $UID -h /$HOME -G $USER $USER
169179

180+
RUN ln -fs /usr/local/bin/ /opt/ejabberd/bin
181+
RUN rm -rf /home \
182+
&& ln -fs /opt /home
183+
170184
################################################################################
171185
#' Build together production image
172-
FROM scratch AS prod
186+
FROM scratch
173187
ARG USER
174188
ARG HOME
175189

@@ -186,7 +200,7 @@ HEALTHCHECK \
186200
WORKDIR /$HOME
187201
USER $USER
188202
VOLUME ["/$HOME"]
189-
EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443
203+
EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443
190204

191205
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
192206
CMD ["foreground"]

0 commit comments

Comments
 (0)