From 2ac783a300694872de508cda5d8fb0a5dcaa0588 Mon Sep 17 00:00:00 2001 From: Toby Batch Date: Tue, 2 Apr 2024 16:50:24 +0100 Subject: [PATCH] split docker to use base image for faster builds (#4586) --- .docker/Dockerfile.kimai-base | 209 +++++++++++++++++++++++++++++ .docker/test-lite.sh | 25 ---- .github/workflows/docker-base.yaml | 43 ++++++ .github/workflows/docker.yaml | 2 - .gitignore | 4 +- Dockerfile | 189 +------------------------- 6 files changed, 260 insertions(+), 212 deletions(-) create mode 100644 .docker/Dockerfile.kimai-base delete mode 100755 .docker/test-lite.sh create mode 100644 .github/workflows/docker-base.yaml diff --git a/.docker/Dockerfile.kimai-base b/.docker/Dockerfile.kimai-base new file mode 100644 index 00000000..abd1b0dc --- /dev/null +++ b/.docker/Dockerfile.kimai-base @@ -0,0 +1,209 @@ +# Source base [fpm/apache] +ARG BASE="fpm" +ARG PHP_VER="8.2" +ARG COMPOSER_VER="latest" +ARG TIMEZONE="Europe/London" + +########################### +# Shared tools +########################### + +# composer base image +FROM composer:${COMPOSER_VER} AS composer + +########################### +# PHP extensions +########################### + +#fpm alpine php extension base +FROM php:${PHP_VER}-fpm-alpine AS fpm-php-ext-base +RUN apk add --no-cache \ + # build-tools + autoconf \ + dpkg \ + dpkg-dev \ + file \ + g++ \ + gcc \ + icu-dev \ + libatomic \ + libc-dev \ + libgomp \ + libmagic \ + m4 \ + make \ + mpc1 \ + mpfr4 \ + musl-dev \ + perl \ + re2c \ + # gd + freetype-dev \ + libpng-dev \ + # icu + icu-dev \ + icu-data-full \ + # ldap + openldap-dev \ + libldap \ + # zip + libzip-dev \ + # xsl + libxslt-dev + + +# apache debian php extension base +FROM php:${PHP_VER}-apache-bookworm AS apache-php-ext-base +RUN apt-get update +RUN apt-get install -y \ + libldap2-dev \ + libicu-dev \ + libpng-dev \ + libzip-dev \ + libxslt1-dev \ + libfreetype6-dev + + +# php extension gd - 13.86s +FROM ${BASE}-php-ext-base AS php-ext-gd +RUN docker-php-ext-configure gd \ + --with-freetype && \ + docker-php-ext-install -j$(nproc) gd + +# php extension intl : 15.26s +FROM ${BASE}-php-ext-base AS php-ext-intl +RUN docker-php-ext-install -j$(nproc) intl + +# php extension ldap : 8.45s +FROM ${BASE}-php-ext-base AS php-ext-ldap +RUN docker-php-ext-configure ldap && \ + docker-php-ext-install -j$(nproc) ldap + +# php extension pdo_mysql : 6.14s +FROM ${BASE}-php-ext-base AS php-ext-pdo_mysql +RUN docker-php-ext-install -j$(nproc) pdo_mysql + +# php extension zip : 8.18s +FROM ${BASE}-php-ext-base AS php-ext-zip +RUN docker-php-ext-install -j$(nproc) zip + +# php extension xsl : ?.?? s +FROM ${BASE}-php-ext-base AS php-ext-xsl +RUN docker-php-ext-install -j$(nproc) xsl + +# php extension redis +FROM ${BASE}-php-ext-base AS php-ext-redis +RUN yes no | pecl install redis && \ + docker-php-ext-enable redis + +# php extension opcache +FROM ${BASE}-php-ext-base AS php-ext-opcache +RUN docker-php-ext-install -j$(nproc) opcache + +########################### +# fpm base build +########################### + +# fpm base build +FROM php:${PHP_VER}-fpm-alpine AS fpm-base +ARG TIMEZONE +RUN apk add --no-cache \ + bash \ + coreutils \ + freetype \ + haveged \ + icu \ + icu-data-full \ + libldap \ + libpng \ + libzip \ + libxslt-dev \ + fcgi \ + tzdata && \ + touch /use_fpm + +EXPOSE 9000 + +HEALTHCHECK --interval=20s --timeout=10s --retries=3 \ + CMD \ + SCRIPT_NAME=/ping \ + SCRIPT_FILENAME=/ping \ + REQUEST_METHOD=GET \ + cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1 + + + +########################### +# apache base build +########################### + +FROM php:${PHP_VER}-apache-bookworm AS apache-base +ARG TIMEZONE +RUN apt-get update && \ + apt-get install -y \ + bash \ + haveged \ + libicu72 \ + libpng16-16 \ + libzip4 \ + libxslt1.1 \ + libfreetype6 && \ + echo "Listen 8001" > /etc/apache2/ports.conf && \ + a2enmod rewrite && \ + touch /use_apache + +EXPOSE 8001 + +HEALTHCHECK --interval=20s --timeout=10s --retries=3 \ + CMD curl -f http://127.0.0.1:8001 || exit 1 + + + +########################### +# global base build +########################### + +FROM ${BASE}-base AS base +ARG TIMEZONE + +LABEL maintainer="tobias@neontribe.co.uk" + +ENV TIMEZONE=${TIMEZONE} +RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone && \ + # make composer home dir + mkdir /composer && \ + chown -R www-data:www-data /composer && \ + echo "echo -e This imnage is not intended to be used stand alone. It's a base image\necho for the Kimai project. https://www.kimai.org\n" > /entrypoint.sh && \ + chmod 777 /entrypoint.sh +# copy composer +COPY --from=composer /usr/bin/composer /usr/bin/composer + +# copy php extensions + +# PHP extension xsl +COPY --from=php-ext-xsl /usr/local/etc/php/conf.d/docker-php-ext-xsl.ini /usr/local/etc/php/conf.d/docker-php-ext-xsl.ini +COPY --from=php-ext-xsl /usr/local/lib/php/extensions/no-debug-non-zts-20220829/xsl.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/xsl.so +# PHP extension pdo_mysql +COPY --from=php-ext-pdo_mysql /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini +COPY --from=php-ext-pdo_mysql /usr/local/lib/php/extensions/no-debug-non-zts-20220829/pdo_mysql.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/pdo_mysql.so +# PHP extension zip +COPY --from=php-ext-zip /usr/local/etc/php/conf.d/docker-php-ext-zip.ini /usr/local/etc/php/conf.d/docker-php-ext-zip.ini +COPY --from=php-ext-zip /usr/local/lib/php/extensions/no-debug-non-zts-20220829/zip.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/zip.so +# PHP extension ldap +COPY --from=php-ext-ldap /usr/local/etc/php/conf.d/docker-php-ext-ldap.ini /usr/local/etc/php/conf.d/docker-php-ext-ldap.ini +COPY --from=php-ext-ldap /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ldap.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ldap.so +# PHP extension gd +COPY --from=php-ext-gd /usr/local/etc/php/conf.d/docker-php-ext-gd.ini /usr/local/etc/php/conf.d/docker-php-ext-gd.ini +COPY --from=php-ext-gd /usr/local/lib/php/extensions/no-debug-non-zts-20220829/gd.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/gd.so +# PHP extension intl +COPY --from=php-ext-intl /usr/local/etc/php/conf.d/docker-php-ext-intl.ini /usr/local/etc/php/conf.d/docker-php-ext-intl.ini +COPY --from=php-ext-intl /usr/local/lib/php/extensions/no-debug-non-zts-20220829/intl.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/intl.so +# PHP extension redis +COPY --from=php-ext-redis /usr/local/etc/php/conf.d/docker-php-ext-redis.ini /usr/local/etc/php/conf.d/docker-php-ext-redis.ini +COPY --from=php-ext-redis /usr/local/lib/php/extensions/no-debug-non-zts-20220829/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/redis.so +COPY --from=php-ext-opcache /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini + +CMD [ "/entrypoint.sh" ] + +# docker build -t kimai/kimai-base:fpm --build-arg BASE=fpm . +# docker build -t kimai/kimai-base:apache --build-arg BASE=apache . diff --git a/.docker/test-lite.sh b/.docker/test-lite.sh deleted file mode 100755 index 6aa38f09..00000000 --- a/.docker/test-lite.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -e - -if [ -z "$DATABASE_URL" ]; then - DATABASE_URL="mysql://kimai:kimai@127.0.0.1:3306/kimai?charset=utf8mb4&serverVersion=5.7.40" -fi - -/opt/kimai/bin/console kimai:version -if [ $? != 0 ]; then - echo "PHP/Kimai not responding" - exit 1 -fi - -# Test FPM CGI -if [ -f /use_fpm ]; then - echo Testing FPM - php-fpm -t -fi - -# Test Apache/httpd -if [ -f /use_apache ]; then - echo Testing Apache - apache2ctl -t -fi - -exit 0 diff --git a/.github/workflows/docker-base.yaml b/.github/workflows/docker-base.yaml new file mode 100644 index 00000000..ab2c676b --- /dev/null +++ b/.github/workflows/docker-base.yaml @@ -0,0 +1,43 @@ +name: 'Docker Build' +# act -j build -W ./.github/workflows/docker-base.yaml --secret-file .dockerhub.secrets + +on: + workflow_dispatch: + schedule: + - cron: "0 4 5 * *" # build on the 5th of every month + +jobs: + build: + strategy: + matrix: + server: [ fpm, apache ] + runs-on: ubuntu-latest + + steps: + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{secrets.DOCKERHUB_USERNAME}} + password: ${{secrets.DOCKERHUB_PASSWORD}} + + - name: Build + uses: docker/build-push-action@v4 + with: + context: .docker + file: .docker/Dockerfile.kimai-base + build-args: | + TIMEZONE=Europe/London + BASE=${{ matrix.server }} + platforms: linux/amd64,linux/arm64 #,linux/arm/v8,linux/arm/v7,linux/arm/v6 + tags: | + kimai/kimai-base:${{ matrix.server }} + push: true + + diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 2c933797..3b0959da 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -49,8 +49,6 @@ jobs: kimai/kimai2:${{ matrix.server }}-${{ matrix.type }} kimai/kimai2:${{ matrix.server }}-${{ env.kimai_version }}-${{ matrix.type }} push: true - - name: Test Lite - run: docker run --rm --entrypoint /assets/test-lite.sh kimai/kimai2:${{ matrix.server }}-${{ matrix.type }} tag: needs: build diff --git a/.gitignore b/.gitignore index 832a3db2..797f26bd 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,6 @@ npm-debug.log yarn-error.log ###< symfony/webpack-encore-bundle ### -/nbproject/* \ No newline at end of file +/nbproject/* + +.dockerhub.secrets diff --git a/Dockerfile b/Dockerfile index bdd04884..d125a878 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,164 +28,16 @@ RUN apk add --no-cache git && \ # production kimai source FROM git-dev AS git-prod - WORKDIR /opt/kimai RUN rm -r tests -# composer base image -FROM composer:${COMPOSER_VER} AS composer -########################### -# PHP extensions -########################### +# FPM base +FROM kimai/kimai-base:fpm as fpm-base -#fpm alpine php extension base -FROM php:${PHP_VER}-fpm-alpine AS fpm-php-ext-base -RUN apk add --no-cache \ - # build-tools - autoconf \ - dpkg \ - dpkg-dev \ - file \ - g++ \ - gcc \ - icu-dev \ - libatomic \ - libc-dev \ - libgomp \ - libmagic \ - m4 \ - make \ - mpc1 \ - mpfr4 \ - musl-dev \ - perl \ - re2c \ - # gd - freetype-dev \ - libpng-dev \ - # icu - icu-dev \ - icu-data-full \ - # ldap - openldap-dev \ - libldap \ - # zip - libzip-dev \ - # xsl - libxslt-dev - - -# apache debian php extension base -FROM php:${PHP_VER}-apache-bookworm AS apache-php-ext-base -RUN apt-get update -RUN apt-get install -y \ - libldap2-dev \ - libicu-dev \ - libpng-dev \ - libzip-dev \ - libxslt1-dev \ - libfreetype6-dev - - -# php extension gd - 13.86s -FROM ${BASE}-php-ext-base AS php-ext-gd -RUN docker-php-ext-configure gd \ - --with-freetype && \ - docker-php-ext-install -j$(nproc) gd - -# php extension intl : 15.26s -FROM ${BASE}-php-ext-base AS php-ext-intl -RUN docker-php-ext-install -j$(nproc) intl - -# php extension ldap : 8.45s -FROM ${BASE}-php-ext-base AS php-ext-ldap -RUN docker-php-ext-configure ldap && \ - docker-php-ext-install -j$(nproc) ldap - -# php extension pdo_mysql : 6.14s -FROM ${BASE}-php-ext-base AS php-ext-pdo_mysql -RUN docker-php-ext-install -j$(nproc) pdo_mysql - -# php extension zip : 8.18s -FROM ${BASE}-php-ext-base AS php-ext-zip -RUN docker-php-ext-install -j$(nproc) zip - -# php extension xsl : ?.?? s -FROM ${BASE}-php-ext-base AS php-ext-xsl -RUN docker-php-ext-install -j$(nproc) xsl - -# php extension redis -FROM ${BASE}-php-ext-base AS php-ext-redis -RUN yes no | pecl install redis && \ - docker-php-ext-enable redis - -# php extension opcache -FROM ${BASE}-php-ext-base AS php-ext-opcache -RUN docker-php-ext-install -j$(nproc) opcache - -########################### -# fpm base build -########################### - -# fpm base build -FROM php:${PHP_VER}-fpm-alpine AS fpm-base -ARG KIMAI -ARG TIMEZONE -RUN apk add --no-cache \ - bash \ - coreutils \ - freetype \ - haveged \ - icu \ - icu-data-full \ - libldap \ - libpng \ - libzip \ - libxslt-dev \ - fcgi \ - tzdata && \ - touch /use_fpm - -EXPOSE 9000 - -HEALTHCHECK --interval=20s --timeout=10s --retries=3 \ - CMD \ - SCRIPT_NAME=/ping \ - SCRIPT_FILENAME=/ping \ - REQUEST_METHOD=GET \ - cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1 - - - -########################### -# apache base build -########################### - -FROM php:${PHP_VER}-apache-bookworm AS apache-base -ARG KIMAI -ARG TIMEZONE +# Apache base +FROM kimai/kimai-base:apache as apache-base COPY .docker/000-default.conf /etc/apache2/sites-available/000-default.conf -RUN apt-get update && \ - apt-get install -y \ - bash \ - haveged \ - libicu72 \ - libldap-common \ - libpng16-16 \ - libzip4 \ - libxslt1.1 \ - libfreetype6 && \ - echo "Listen 8001" > /etc/apache2/ports.conf && \ - a2enmod rewrite && \ - touch /use_apache - -EXPOSE 8001 - -HEALTHCHECK --interval=20s --timeout=10s --retries=3 \ - CMD curl -f http://127.0.0.1:8001 || exit 1 - - ########################### # global base build @@ -196,13 +48,11 @@ ARG KIMAI ARG TIMEZONE LABEL maintainer="tobias@neontribe.co.uk" -LABEL maintainer="bastian@schroll-software.de" ENV KIMAI=${KIMAI} ENV TIMEZONE=${TIMEZONE} RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone && \ - # make composer home dir - mkdir /composer && \ + mkdir -p /composer && \ chown -R www-data:www-data /composer # copy startup script & DB checking script @@ -211,34 +61,6 @@ COPY .docker/service.sh /service.sh COPY .docker/self-test.sh /self-test.sh COPY .docker/dbtest.php /dbtest.php -# copy composer -COPY --from=composer /usr/bin/composer /usr/bin/composer - -# copy php extensions - -# PHP extension xsl -COPY --from=php-ext-xsl /usr/local/etc/php/conf.d/docker-php-ext-xsl.ini /usr/local/etc/php/conf.d/docker-php-ext-xsl.ini -COPY --from=php-ext-xsl /usr/local/lib/php/extensions/no-debug-non-zts-20220829/xsl.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/xsl.so -# PHP extension pdo_mysql -COPY --from=php-ext-pdo_mysql /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini -COPY --from=php-ext-pdo_mysql /usr/local/lib/php/extensions/no-debug-non-zts-20220829/pdo_mysql.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/pdo_mysql.so -# PHP extension zip -COPY --from=php-ext-zip /usr/local/etc/php/conf.d/docker-php-ext-zip.ini /usr/local/etc/php/conf.d/docker-php-ext-zip.ini -COPY --from=php-ext-zip /usr/local/lib/php/extensions/no-debug-non-zts-20220829/zip.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/zip.so -# PHP extension ldap -COPY --from=php-ext-ldap /usr/local/etc/php/conf.d/docker-php-ext-ldap.ini /usr/local/etc/php/conf.d/docker-php-ext-ldap.ini -COPY --from=php-ext-ldap /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ldap.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ldap.so -# PHP extension gd -COPY --from=php-ext-gd /usr/local/etc/php/conf.d/docker-php-ext-gd.ini /usr/local/etc/php/conf.d/docker-php-ext-gd.ini -COPY --from=php-ext-gd /usr/local/lib/php/extensions/no-debug-non-zts-20220829/gd.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/gd.so -# PHP extension intl -COPY --from=php-ext-intl /usr/local/etc/php/conf.d/docker-php-ext-intl.ini /usr/local/etc/php/conf.d/docker-php-ext-intl.ini -COPY --from=php-ext-intl /usr/local/lib/php/extensions/no-debug-non-zts-20220829/intl.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/intl.so -# PHP extension redis -COPY --from=php-ext-redis /usr/local/etc/php/conf.d/docker-php-ext-redis.ini /usr/local/etc/php/conf.d/docker-php-ext-redis.ini -COPY --from=php-ext-redis /usr/local/lib/php/extensions/no-debug-non-zts-20220829/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/redis.so -COPY --from=php-ext-opcache /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini - ENV DATABASE_URL="mysql://kimai:kimai@127.0.0.1:3306/kimai?charset=utf8mb4&serverVersion=5.7.40" ENV APP_SECRET=change_this_to_something_unique # The default container name for nginx is nginx @@ -266,7 +88,6 @@ VOLUME [ "/opt/kimai/var" ] CMD [ "/startup.sh" ] - ########################### # final builds ###########################