Use SonarQube 8.9 LTS on arm64v8 Docker
Streamline your code quality on the cutting-edge with SonarQube 8.9 LTS on arm64v8 Docker. By: Dániel Sipos onIn today’s fast-paced software development world, maintaining code quality is more important than ever. That’s where SonarQube 8.9 LTS comes in - a powerful code analysis tool that allows developers to track and improve code quality throughout the development process. But the SonarQube 8.9 LTS does not have an official support for arm64v8 Docker image. So I use custom Dockerfile to resolve this issue for me!
FROM alpine:3.12
ENV JAVA_VERSION="jdk-11.0.11+9"
LANG='en_US.UTF-8'
LANGUAGE='en_US:en'
LC_ALL='en_US.UTF-8'
#
# glibc setup
#
RUN set -eux;
apk add --no-cache tzdata --virtual .build-deps binutils curl gnupg zstd;
GLIBC_VER="2.32-r0";
ALPINE_GLIBC_REPO="https://github.com/ljfranklin/alpine-pkg-glibc/releases/download";
GCC_LIBS_URL="https://mirrors.dotsrc.org/archlinuxarm/aarch64/core/gcc-libs-12.1.0-2.1-aarch64.pkg.tar.xz";
ZLIB_URL="https://mirrors.dotsrc.org/archlinuxarm/aarch64/core/zlib-1%3A1.2.13-2-aarch64.pkg.tar.xz";
curl -LfsS https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub;
SGERRAND_RSA_SHA256="823b54589c93b02497f1ba4dc622eaef9c813e6b0f0ebbb2f771e32adf9f4ef2";
echo "${SGERRAND_RSA_SHA256} */etc/apk/keys/sgerrand.rsa.pub" | sha256sum -c - ;
gpg --keyserver hkp://pgp.mit.edu --recv-key 68B3537F39A313B3E574D06777193F152BDBE6A6;
curl -LfsS ${ALPINE_GLIBC_REPO}/${GLIBC_VER}-arm64/glibc-${GLIBC_VER}.apk > /tmp/glibc-${GLIBC_VER}.apk;
apk add --allow-untrusted --no-cache /tmp/glibc-${GLIBC_VER}.apk;
curl -LfsS ${ALPINE_GLIBC_REPO}/${GLIBC_VER}-arm64/glibc-bin-${GLIBC_VER}.apk > /tmp/glibc-bin-${GLIBC_VER}.apk;
apk add --allow-untrusted --no-cache /tmp/glibc-bin-${GLIBC_VER}.apk;
curl -Ls ${ALPINE_GLIBC_REPO}/${GLIBC_VER}-arm64/glibc-i18n-${GLIBC_VER}.apk > /tmp/glibc-i18n-${GLIBC_VER}.apk;
apk add --allow-untrusted --no-cache /tmp/glibc-i18n-${GLIBC_VER}.apk;
/usr/glibc-compat/bin/localedef --inputfile en_US --charmap UTF-8 "$LANG" || true ;
echo "export LANG=$LANG" > /etc/profile.d/locale.sh;
curl -LfsS ${GCC_LIBS_URL} -o /tmp/gcc-libs.tar.xz;
curl -LfsS ${GCC_LIBS_URL}.sig -o /tmp/gcc-libs.tar.xz.sig;
gpg --verify /tmp/gcc-libs.tar.xz.sig;
mkdir /tmp/gcc;
tar -xf /tmp/gcc-libs.tar.xz -C /tmp/gcc;
mv /tmp/gcc/usr/lib/libgcc* /tmp/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib;
strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so*;
curl -LfsS ${ZLIB_URL} -o /tmp/libz.tar.xz;
curl -LfsS ${ZLIB_URL}.sig -o /tmp/libz.tar.xz.sig;
gpg --verify /tmp/libz.tar.xz.sig;
mkdir /tmp/libz;
tar -xf /tmp/libz.tar.xz -C /tmp/libz;
mv /tmp/libz/usr/lib/libz.so* /usr/glibc-compat/lib;
apk del --purge .build-deps glibc-i18n;
rm -rf /tmp/*.apk /tmp/gcc /tmp/gcc-libs.tar* /tmp/libz /tmp/libz.tar.xz /var/cache/apk/*;
#
# AdoptOpenJDK/openjdk11 setup
#
RUN set -eux;
apk add --no-cache --virtual .fetch-deps curl;
ARCH="$(apk --print-arch)";
case "${ARCH}" in
aarch64|arm64)
ESUM='fde6b29df23b6e7ed6e16a237a0f44273fb9e267fdfbd0b3de5add98e55649f6';
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_aarch64_linux_hotspot_11.0.11_9.tar.gz';
;;
armhf|armv7l)
ESUM='ad02656f800fd64c2b090b23ad24a099d9cd1054948ecb0e9851bc39c51c8be8';
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_arm_linux_hotspot_11.0.11_9.tar.gz';
;;
ppc64el|ppc64le)
ESUM='37c19c7c2d1cea627b854a475ef1a765d30357d765d20cf3f96590037e79d0f3';
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_ppc64le_linux_hotspot_11.0.11_9.tar.gz';
;;
s390x)
ESUM='f18101fc50aad795a41b4d3bbc591308c83664fd2390bf2bc007fd9b3d531e6c';
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_s390x_linux_hotspot_11.0.11_9.tar.gz';
;;
amd64|x86_64)
ESUM='144f2c6bcf64faa32016f2474b6c01031be75d25325e9c3097aed6589bc5d548';
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_x64_linux_hotspot_11.0.11_9.tar.gz';
;;
*)
echo "Unsupported arch: ${ARCH}";
exit 1;
;;
esac;
curl -LfsSo /tmp/openjdk.tar.gz ${BINARY_URL};
echo "${ESUM} */tmp/openjdk.tar.gz" | sha256sum -c -;
mkdir -p /opt/java/openjdk;
cd /opt/java/openjdk;
tar -xf /tmp/openjdk.tar.gz --strip-components=1;
apk del --purge .fetch-deps;
rm -rf /var/cache/apk/*;
rm -rf /tmp/openjdk.tar.gz;
#
# SonarQube setup
#
ARG SONARQUBE_VERSION=8.9.10.61524
ARG SONARQUBE_ZIP_URL=https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-${SONARQUBE_VERSION}.zip
ENV JAVA_HOME=/opt/java/openjdk
PATH="/opt/java/openjdk/bin:$PATH"
SONARQUBE_HOME=/opt/sonarqube
SONAR_VERSION="${SONARQUBE_VERSION}"
SQ_DATA_DIR="/opt/sonarqube/data"
SQ_EXTENSIONS_DIR="/opt/sonarqube/extensions"
SQ_LOGS_DIR="/opt/sonarqube/logs"
SQ_TEMP_DIR="/opt/sonarqube/temp"
RUN set -eux;
addgroup -S -g 1000 sonarqube;
adduser -S -D -u 1000 -G sonarqube sonarqube;
apk add --no-cache --virtual build-dependencies gnupg unzip curl;
apk add --no-cache bash su-exec ttf-dejavu;
# pub 2048R/D26468DE 2015-05-25
# Key fingerprint = F118 2E81 C792 9289 21DB CAB4 CFCA 4A29 D264 68DE
# uid sonarsource_deployer (Sonarsource Deployer) <infra@sonarsource.com>
# sub 2048R/06855C1D 2015-05-25
echo "networkaddress.cache.ttl=5" >> "${JAVA_HOME}/conf/security/java.security";
sed --in-place --expression="s?securerandom.source=file:/dev/random?securerandom.source=file:/dev/urandom?g" "${JAVA_HOME}/conf/security/java.security";
for server in $(shuf -e ha.pool.sks-keyservers.net
hkp://p80.pool.sks-keyservers.net:80
keyserver.ubuntu.com
hkp://keyserver.ubuntu.com:80
pgp.mit.edu) ; do
gpg --batch --keyserver "${server}" --recv-keys 679F1EE92B19609DE816FDE81DB198F93525EC1A && break || : ;
done;
mkdir --parents /opt;
cd /opt;
curl --fail --location --output sonarqube.zip --silent --show-error "${SONARQUBE_ZIP_URL}";
curl --fail --location --output sonarqube.zip.asc --silent --show-error "${SONARQUBE_ZIP_URL}.asc";
gpg --batch --verify sonarqube.zip.asc sonarqube.zip;
unzip -q sonarqube.zip;
mv "sonarqube-${SONARQUBE_VERSION}" sonarqube;
rm sonarqube.zip*;
rm -rf ${SONARQUBE_HOME}/bin/*;
chown -R sonarqube:sonarqube ${SONARQUBE_HOME};
# this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)
chmod -R 777 "${SQ_DATA_DIR}" "${SQ_EXTENSIONS_DIR}" "${SQ_LOGS_DIR}" "${SQ_TEMP_DIR}";
apk del --purge build-dependencies;
COPY data/run.sh data/sonar.sh ${SONARQUBE_HOME}/bin/
COPY data/sonar-healthcheck.sh /usr/local/bin/
# COPY sonar-custom-plugin-1.0.jar /opt/sonarqube/extensions/
WORKDIR ${SONARQUBE_HOME}
EXPOSE 9000
ENTRYPOINT ["bin/run.sh"]
CMD ["bin/sonar.sh"]
Last words
I use this Dockerfile to run SonarQube on my cloud machine for 2 years, and it works great! In the future the developer team of SonarQube make an official release of arm64v8 version.