video-iac/docker/coturn/Dockerfile

213 lines
6.3 KiB
Docker

#
# Dockerfile of coturn/coturn:alpine Docker image.
#
ARG alpine_ver=3.14.2
#
# Stage 'dist-libprom' creates prometheus-client-c distribution.
#
# We compile prometheus-client-c from sources, because Alpine doesn't provide
# it as its package yet.
#
# TODO: Re-check this to be present in packages on next Alpine major version update.
# https://hub.docker.com/_/alpine
FROM alpine:${alpine_ver} AS dist-libprom
# Install tools for building.
RUN apk update \
&& apk add --no-cache \
ca-certificates cmake g++ git make curl bash\
&& update-ca-certificates
# Install prometheus-client-c build dependencies.
RUN apk add --no-cache \
libmicrohttpd-dev
# Prepare prometheus-client-c sources for building.
ARG prom_ver=0.1.3
RUN mkdir -p /build/ && cd /build/ \
&& git init \
&& git remote add origin https://github.com/digitalocean/prometheus-client-c \
&& git fetch --depth=1 origin "v${prom_ver}" \
&& git checkout FETCH_HEAD
# Build libprom.so from sources.
RUN mkdir -p /build/prom/build/ && cd /build/prom/build/ \
&& TEST=0 cmake -G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_SKIP_BUILD_RPATH=TRUE \
-DCMAKE_C_FLAGS="-DPROM_LOG_ENABLE -g -O3" \
.. \
&& make
# Build libpromhttp.so from sources.
RUN mkdir -p /build/promhttp/build/ && cd /build/promhttp/build/ \
# Fix compiler warning: -Werror=incompatible-pointer-types
&& sed -i 's/\&promhttp_handler/(MHD_AccessHandlerCallback)\&promhttp_handler/' \
/build/promhttp/src/promhttp.c \
&& TEST=0 cmake -G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_SKIP_BUILD_RPATH=TRUE \
-DCMAKE_C_FLAGS="-g -O3" \
.. \
&& make VERBOSE=1
# Install prometheus-client-c.
RUN LIBS_DIR=/out/$(dirname $(find /usr/ -name libc.so)) \
&& mkdir -p $LIBS_DIR/ \
&& cp -rf /build/prom/build/libprom.so \
/build/promhttp/build/libpromhttp.so \
$LIBS_DIR/ \
&& mkdir -p /out/usr/include/ \
&& cp -rf /build/prom/include/* \
/build/promhttp/include/* \
/out/usr/include/ \
# Preserve license file.
&& mkdir -p /out/usr/share/licenses/prometheus-client-c/ \
&& cp /build/LICENSE /out/usr/share/licenses/prometheus-client-c/
#
# Stage 'dist-coturn' creates Coturn distribution.
#
# https://hub.docker.com/_/alpine
FROM alpine:${alpine_ver} AS dist-coturn
ARG coturn_ver=4.5.2
# Install tools for building.
RUN apk update \
&& apk add --no-cache \
autoconf ca-certificates coreutils g++ git libtool make curl bash \
&& update-ca-certificates
# Install Coturn build dependencies.
RUN apk add --no-cache \
linux-headers \
libevent-dev \
openssl-dev \
postgresql-dev mariadb-connector-c-dev sqlite-dev \
hiredis-dev \
mongo-c-driver-dev \
libmicrohttpd-dev
# Install prometheus-client-c distribution.
COPY --from=dist-libprom /out/ /
# Download and prepare Coturn sources.
RUN curl -fL -o /tmp/coturn.tar.gz \
https://github.com/coturn/coturn/archive/${coturn_ver}.tar.gz \
&& tar -xzf /tmp/coturn.tar.gz -C /tmp/ \
&& mv /tmp/coturn-${coturn_ver} /app
WORKDIR /app/
# Use Coturn sources from Git if `coturn_git_ref` is specified.
ARG coturn_git_ref=HEAD
RUN if [ "${coturn_git_ref}" != 'HEAD' ]; then true \
&& rm -rf /app/* \
&& git init \
&& git remote add origin https://github.com/coturn/coturn \
&& git fetch --depth=1 origin "${coturn_git_ref}" \
&& git checkout FETCH_HEAD \
&& true; fi
# Build Coturn from sources.
# TODO: Remove this symlink with next Coturn release detecting MySQL libs correctly.
RUN ln -s /usr/lib/pkgconfig/libmariadb.pc /usr/lib/pkgconfig/mariadb.pc \
&& ./configure --prefix=/usr \
--turndbdir=/var/lib/coturn \
--disable-rpath \
--sysconfdir=/etc/coturn \
# No documentation included to keep image size smaller.
--mandir=/tmp/coturn/man \
--docsdir=/tmp/coturn/docs \
--examplesdir=/tmp/coturn/examples \
&& make
# Install and configure Coturn.
RUN mkdir -p /out/ \
&& DESTDIR=/out make install \
# Remove redundant files.
&& rm -rf /out/tmp/ \
# Preserve license file.
&& mkdir -p /out/usr/share/licenses/coturn/ \
&& cp LICENSE /out/usr/share/licenses/coturn/ \
# Remove default config file.
&& rm -f /out/etc/coturn/turnserver.conf.default
# Install helper tools of Docker image.
COPY docker/coturn/rootfs/ /out/
RUN chmod +x /out/usr/local/bin/docker-entrypoint.sh \
/out/usr/local/bin/detect-external-ip.sh \
/out/usr/local/bin/launch-coturn.sh
RUN ln -s /usr/local/bin/detect-external-ip.sh \
/out/usr/local/bin/detect-external-ip
#RUN chown -R nobody:nogroup /out/var/lib/coturn/
# Re-export prometheus-client-c distribution.
COPY --from=dist-libprom /out/ /out/
#
# Stage 'runtime' creates final Docker image to use in runtime.
#
# https://hub.docker.com/_/alpine
FROM alpine:${alpine_ver} AS runtime
LABEL org.opencontainers.image.source="https://github.com/coturn/coturn"
# Update system packages.
RUN apk update \
&& apk upgrade \
&& apk add --no-cache ca-certificates \
&& update-ca-certificates \
# Install Coturn dependencies.
&& apk add --no-cache \
libevent \
libcrypto1.1 libssl1.1 \
libpq mariadb-connector-c sqlite-libs \
hiredis \
mongo-c-driver \
libmicrohttpd \
# Install `dig` tool for `detect-external-ip.sh`.
&& apk add --no-cache \
bind-tools curl\
# Cleanup unnecessary stuff.
&& rm -rf /var/cache/apk/*
# Install Coturn distribution.
COPY --from=dist-coturn /out/ /
# Allow non-root using privileged ports.
RUN apk add --no-cache libcap bash \
&& setcap CAP_NET_BIND_SERVICE=+ep /usr/bin/turnserver \
# Cleanup unnecessary stuff.
&& apk del libcap \
&& rm -rf /var/cache/apk/*
# COPY docker/coturn/rootfs /
# RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
# /usr/local/bin/detect-external-ip.sh \
# /usr/local/bin/launch-coturn.sh \
# && ln -s /usr/local/bin/detect-external-ip.sh \
# /usr/local/bin/detect-external-ip
RUN chown -R nobody:nogroup /var/lib/coturn/
EXPOSE 3478 3478/udp
VOLUME ["/var/lib/coturn"]
ENTRYPOINT ["/usr/local/bin/launch-coturn.sh"]
# CMD ["--log-file=stdout", "--external-ip=192.168.1.5", "--min-port", "49160", "--max-port", "49200"]