From 921a703ea2f5064ce97a729f8b485f3f18db5cda Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Fri, 4 Oct 2024 11:14:10 +0200 Subject: [PATCH] Merge Docker images (#5094) --- .docker/Dockerfile | 215 ---------------------------- .github/workflows/docker-base.yaml | 42 ------ .github/workflows/docker.yaml | 67 ++++----- Dockerfile | 222 ++++++++++++++++++++++++++--- 4 files changed, 228 insertions(+), 318 deletions(-) delete mode 100644 .docker/Dockerfile delete mode 100644 .github/workflows/docker-base.yaml diff --git a/.docker/Dockerfile b/.docker/Dockerfile deleted file mode 100644 index fe4b13ae..00000000 --- a/.docker/Dockerfile +++ /dev/null @@ -1,215 +0,0 @@ -# _ ___ _ -# | |/ (_)_ __ ___ __ _(_) -# | ' /| | '_ ` _ \ / _` | | -# | . \| | | | | | | (_| | | -# |_|\_\_|_| |_| |_|\__,_|_| -# -# Base images for: -# - plain PHP FPM -# - Apache with PHP -# --------------------------------------------------------------------- -# For production builds: -# -# docker build -t kimai/kimai-base:fpm --build-arg BASE=fpm . -# docker build -t kimai/kimai-base:apache --build-arg BASE=apache . -# --------------------------------------------------------------------- -# For local testing by maintainer: -# -# docker build -t kimai-local-fpm-base --build-arg BASE=fpm . -# docker build -t kimai-local-apache-base --build-arg BASE=apache . -# --------------------------------------------------------------------- -# Documentation: -# https://hub.docker.com/_/php/ -# https://github.com/docker-library/docs/blob/master/php/README.md#supported-tags-and-respective-dockerfile-links -# --------------------------------------------------------------------- - -ARG BASE="fpm" -ARG TIMEZONE="Europe/Berlin" - -########################### -# Shared tools -########################### - -# composer base image -FROM composer:latest AS composer - -########################### -# PHP extensions -########################### - -# fpm alpine php extension base -FROM php:8.3-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:8.3-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 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:8.3-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:8.3-apache-bookworm AS apache-base -ARG TIMEZONE -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 -########################### - -FROM ${BASE}-base AS base -ARG TIMEZONE - -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 \"This image is not intended to be used stand alone. It's a base image for the Kimai project.\"" > /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-20230831/xsl.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/pdo_mysql.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/zip.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/ldap.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/gd.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/intl.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/intl.so -# PHP extension opcache -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" ] \ No newline at end of file diff --git a/.github/workflows/docker-base.yaml b/.github/workflows/docker-base.yaml deleted file mode 100644 index 63df4a17..00000000 --- a/.github/workflows/docker-base.yaml +++ /dev/null @@ -1,42 +0,0 @@ -name: 'Docker base image' -# 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@v3 - - - name: Login to DockerHub - uses: docker/login-action@v3 - with: - username: ${{secrets.DOCKERHUB_USERNAME}} - password: ${{secrets.DOCKERHUB_PASSWORD}} - - - name: Build - uses: docker/build-push-action@v5 - with: - context: .docker - file: .docker/Dockerfile - build-args: | - 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 99c96ba2..89aa4afc 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -1,16 +1,11 @@ name: 'Docker Build' -# act -j build -W ./.github/workflows/docker.yaml --secret-file .dockerhub.secrets on: - workflow_dispatch: release: types: [released] jobs: build: - strategy: - matrix: - server: [ fpm, apache ] runs-on: ubuntu-latest steps: @@ -18,41 +13,51 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Install buildx - uses: docker/setup-buildx-action@v3 - - - name: Install lastversion - run: sudo apt-get update -y; sudo apt-get install --no-install-recommends -y python3 python3-pip; pip install lastversion - - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{secrets.DOCKERHUB_USERNAME}} password: ${{secrets.DOCKERHUB_PASSWORD}} - - name: get lastest version - id: remote_version - run: echo "kimai_version=$(lastversion https://github.com/kimai/kimai)" >> $GITHUB_ENV + - name: Determine version + run: echo "kimai_version=${{ github.event.release.tag_name }}" >> $GITHUB_ENV - - name: Build + - name: FPM image uses: docker/build-push-action@v5 with: context: . + file: Dockerfile build-args: | KIMAI=${{ env.kimai_version }} - BASE=${{ matrix.server }} + BASE=fpm target: prod platforms: linux/amd64,linux/arm64 tags: | - kimai/kimai2:${{ matrix.server }} - kimai/kimai2:${{ matrix.server }}-${{ env.kimai_version }} + kimai/kimai2:latest + kimai/kimai2:fpm + kimai/kimai2:fpm-${{ env.kimai_version }} push: true - - name: Build dev image - if: matrix.server == 'apache' + - name: Apache image uses: docker/build-push-action@v5 with: context: . + file: Dockerfile + build-args: | + KIMAI=${{ env.kimai_version }} + BASE=apache + target: prod + platforms: linux/amd64,linux/arm64 + tags: | + kimai/kimai2:apache + kimai/kimai2:apache-${{ env.kimai_version }} + push: true + + - name: Development image + uses: docker/build-push-action@v5 + with: + context: . + file: Dockerfile build-args: | KIMAI=${{ env.kimai_version }} BASE=apache @@ -61,25 +66,3 @@ jobs: tags: | kimai/kimai2:dev push: true - - tag: - needs: build - runs-on: ubuntu-latest - steps: - - - name: Login to DockerHub - uses: docker/login-action@v3 - with: - username: ${{secrets.DOCKERHUB_USERNAME}} - password: ${{secrets.DOCKERHUB_PASSWORD}} - - - name: Install buildx - uses: docker/setup-buildx-action@v3 - - - name: Pull images - run: | - docker pull kimai/kimai2:fpm - - - name: Tag latest - run: | - docker buildx imagetools create -t kimai/kimai2:latest kimai/kimai2:fpm diff --git a/Dockerfile b/Dockerfile index d47b738a..b9c76f06 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,18 +5,26 @@ # |_|\_\_|_| |_| |_|\__,_|_| # # Kimai images for: -# - plain PHP FPM -# - Apache with PHP +# - plain PHP FPM (kimai/kimai2:fpm) +# - Apache with PHP (kimai/kimai2:apache) +# - Development (kimai/kimai2:dev) # --------------------------------------------------------------------- # For local testing by maintainer: # -# docker build -t kimai-local-fpm --build-arg BASE=fpm . -# docker build -t kimai-local-apache --build-arg BASE=apache . +# docker build --no-cache -t kimai-fpm --build-arg BASE=fpm . +# docker build --no-cache -t kimai-apache --build-arg BASE=apache . +# docker run -d --name kimai-apache +# docker exec -ti kimai-apache /bin/bash +# --------------------------------------------------------------------- +# Official PHP images: https://hub.docker.com/_/php/ +# https://github.com/docker-library/docs/blob/master/php/README.md#supported-tags-and-respective-dockerfile-links +# Pass-through Arguments: https://benkyriakou.com/posts/docker-args-empty +# Best practices: https://docs.docker.com/build/building/best-practices/ # --------------------------------------------------------------------- -# Source base [fpm/apache] +# Source base, one of: fpm, apache ARG BASE="fpm" -# Branch name +# Kimai branch/tag to run ARG KIMAI="main" # Timezone for images ARG TIMEZONE="Europe/Berlin" @@ -25,9 +33,195 @@ ARG TIMEZONE="Europe/Berlin" # Shared tools ########################### +# composer base image +FROM composer:latest AS composer + +########################### +# PHP extensions +########################### + +# fpm alpine php extension base +FROM php:8.3-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:8.3-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 opcache +FROM ${BASE}-php-ext-base AS php-ext-opcache +RUN docker-php-ext-install -j$(nproc) opcache + +########################### +# fpm base build +########################### + +FROM php:8.3-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 && \ + sed -i "s/;ping.path/ping.path/g" /usr/local/etc/php-fpm.d/www.conf && \ + sed -i "s/;access.suppress_path\[\] = \/ping/access.suppress_path\[\] = \/ping/g" /usr/local/etc/php-fpm.d/www.conf + +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:8.3-apache-bookworm AS apache-base +ARG TIMEZONE +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 + +COPY .docker/000-default.conf /etc/apache2/sites-available/000-default.conf + +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 php-base +ARG TIMEZONE + +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 + +# 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-20230831/xsl.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/pdo_mysql.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/zip.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/ldap.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/gd.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/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-20230831/intl.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/intl.so +# PHP extension opcache +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 + +########################### +# Shared tools +########################### + # full kimai source FROM alpine:latest AS git-dev -# pass-through Arguments in every stage. See: https://benkyriakou.com/posts/docker-args-empty ARG KIMAI ARG TIMEZONE RUN apk add --no-cache git && \ @@ -38,20 +232,11 @@ FROM git-dev AS git-prod WORKDIR /opt/kimai RUN rm -r tests -# FPM base -FROM kimai/kimai-base:fpm AS fpm-base -RUN sed -i "s/;ping.path/ping.path/g" /usr/local/etc/php-fpm.d/www.conf && \ - sed -i "s/;access.suppress_path\[\] = \/ping/access.suppress_path\[\] = \/ping/g" /usr/local/etc/php-fpm.d/www.conf - -# Apache base -FROM kimai/kimai-base:apache AS apache-base -COPY .docker/000-default.conf /etc/apache2/sites-available/000-default.conf - ########################### # global base build ########################### -FROM ${BASE}-base AS base +FROM php-base AS base ARG KIMAI ARG TIMEZONE @@ -63,8 +248,7 @@ LABEL org.opencontainers.image.title="Kimai" \ org.opencontainers.image.source="https://github.com/kimai/kimai" \ org.opencontainers.image.version="${KIMAI}" \ org.opencontainers.image.vendor="Kevin Papst" \ - org.opencontainers.image.licenses="AGPL-3.0" \ - org.opencontainers.image.base.name="docker.io/library/alpine" + org.opencontainers.image.licenses="AGPL-3.0" ENV KIMAI=${KIMAI} ENV TIMEZONE=${TIMEZONE}