In light of the possibility of many people needing to work from home the boss wanted to upgrade the phone system to bring in some fixes and new features for home working.
I’ve no experience of Asterisk and I’m not really a phone person, but he asked me to get a replacement system using the latest v17 release. I noticed there are v16 images available, but he was insistent upon v17. That meant building from source.
It’s a week of firsts as up until now I haven’t built a multi-stage Docker image either.
I tried to follow the path of building the image with Alpine as it’s a tiny Linux build that is widely used for Docker builds, but I ran into an issue where I couldn’t find the needed uuid library. I then went to Debian Buster.
Keeping the Dockerfile simple I put much of the make and install processes into shell scripts.
Dockerfile
The two stage build compiles Asterisk from source and then copies the compiled assets into another image leaving behind the tools used to compile it.
FROM debian:buster-slim as builder
LABEL maintainer="paul.bargewell@opusvl.com"
COPY ${PWD}/make.sh /
COPY ${PWD}/entrypoint.sh /entrypoint.sh
RUN chmod +x /make.sh && /make.sh
FROM debian:buster-slim as final
COPY ${PWD}/install.sh /install.sh
RUN chmod +x /install.sh && /install.sh
COPY --from=builder --chown=asterisk:asterisk /usr/lib/libasterisk* /usr/lib/
COPY --from=builder --chown=asterisk:asterisk /usr/lib/asterisk/ /usr/lib/asterisk/
COPY --from=builder --chown=asterisk:asterisk /var/spool/asterisk/ /var/spool/asterisk/
COPY --from=builder --chown=asterisk:asterisk /var/log/asterisk/ /var/log/asterisk/
COPY --from=builder --chown=asterisk:asterisk /usr/sbin/asterisk /usr/sbin/asterisk
COPY --from=builder --chown=asterisk:asterisk /etc/asterisk/ /etc/asterisk/
COPY --from=builder --chown=asterisk:asterisk /etc/init.d/asterisk /etc/init.d/
COPY --from=builder --chown=asterisk:asterisk /var/lib/asterisk/ /var/lib/asterisk/
COPY --from=builder /entrypoint.sh /entrypoint.sh
EXPOSE 5060/udp 5060/tcp 8088/tcp 5038/tcp
VOLUME /var/lib/asterisk/sounds /var/lib/asterisk/keys /var/lib/asterisk/phoneprov /var/spool/asterisk /var/log/asterisk /etc/asterisk
ENTRYPOINT [ "/entrypoint.sh" ]
make.sh
The make script is used by the fist stage of the build. It pulls down the required tools to compile from source and the prerequisites for Asterisk.
#!/bin/sh
apt-get update
apt-get install -y \
build-essential \
curl \
git \
gzip \
libedit-dev \
libjansson-dev \
libldap2-dev \
libncurses5-dev \
libsqlite3-dev \
libsrtp2-dev \
libssl-dev \
libuuid1 \
libxml2-dev \
odbc-postgresql \
openssl \
postgresql-client \
sqlite3 \
tar \
unixodbc \
unixodbc-dev \
uuid-dev \
wget
git clone https://github.com/asterisk/asterisk.git /asterisk
cd /asterisk
./configure
make
make menuselect
make install
make config
make samples
cd /tmp
wget https://downloads.digium.com/pub/telephony/codec_opus/asterisk-17.0/x86-64/codec_opus-17.0_current-x86_64.tar.gz
tar xvzf codec_opus-17.0_current-x86_64.tar.gz
cp codec_opus-17.0_1.3.0-x86_64/*.so /usr/lib/asterisk/modules/
cp codec_opus-17.0_1.3.0-x86_64/codec_opus_config-en_US.xml /var/lib/asterisk/documentation/thirdparty
install.sh
The install script is run as part of the second stage and doesn’t require the compile/build tools. This results in a much smaller image at 380MB, as the first stage comes in a whopping 2.5GB!
#!/bin/sh
apt-get update
apt-get install -y \
festival \
libedit-dev \
libjansson-dev \
libldap2-dev \
libncurses5-dev \
libsqlite3-dev \
libsrtp2-dev \
libssl-dev \
libuuid1 \
libxml2-dev \
odbc-postgresql \
openssl \
postgresql-client \
supervisor \
unixodbc \
unixodbc-dev \
uuid-dev
apt-get autoclean
useradd asterisk
echo "asterisk:Obelix" | chpasswd
entrypoint.sh
Make sure the asterisk user can access the required folders and starts the program in the foreground.
#!/bin/sh
if [ "$1" = "" ]; then
COMMAND="/usr/sbin/asterisk -T -W -U asterisk -p -nvvvdddf"
else
COMMAND="$@"
fi
chown -R asterisk: /var/log/asterisk \
/var/lib/asterisk \
/var/run/asterisk \
/var/spool/asterisk
exec ${COMMAND}
Because the sample configuration is included the /etc/asterisk folder already has the configuration ready to go. We can then pull the files from the image and include them in a volume mount so we can customise them as required.