diff --git a/.docker/Dockerfile.kimai-base b/.docker/Dockerfile similarity index 72% rename from .docker/Dockerfile.kimai-base rename to .docker/Dockerfile index 1413b7d1..fe4b13ae 100644 --- a/.docker/Dockerfile.kimai-base +++ b/.docker/Dockerfile @@ -1,22 +1,44 @@ -# Source base [fpm/apache] +# _ ___ _ +# | |/ (_)_ __ ___ __ _(_) +# | ' /| | '_ ` _ \ / _` | | +# | . \| | | | | | | (_| | | +# |_|\_\_|_| |_| |_|\__,_|_| +# +# 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 PHP_VER="8.2" -ARG COMPOSER_VER="latest" -ARG TIMEZONE="Europe/London" +ARG TIMEZONE="Europe/Berlin" ########################### # Shared tools ########################### # composer base image -FROM composer:${COMPOSER_VER} AS composer +FROM composer:latest AS composer ########################### # PHP extensions ########################### -#fpm alpine php extension base -FROM php:${PHP_VER}-fpm-alpine AS fpm-php-ext-base +# fpm alpine php extension base +FROM php:8.3-fpm-alpine AS fpm-php-ext-base RUN apk add --no-cache \ # build-tools autoconf \ @@ -51,9 +73,8 @@ RUN apk add --no-cache \ # xsl libxslt-dev - # apache debian php extension base -FROM php:${PHP_VER}-apache-bookworm AS apache-php-ext-base +FROM php:8.3-apache-bookworm AS apache-php-ext-base RUN apt-get update RUN apt-get install -y \ libldap2-dev \ @@ -63,7 +84,6 @@ RUN apt-get install -y \ libxslt1-dev \ libfreetype6-dev - # php extension gd - 13.86s FROM ${BASE}-php-ext-base AS php-ext-gd RUN docker-php-ext-configure gd \ @@ -91,11 +111,6 @@ RUN docker-php-ext-install -j$(nproc) zip 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 @@ -105,7 +120,7 @@ RUN docker-php-ext-install -j$(nproc) opcache ########################### # fpm base build -FROM php:${PHP_VER}-fpm-alpine AS fpm-base +FROM php:8.3-fpm-alpine AS fpm-base ARG TIMEZONE RUN apk add --no-cache \ bash \ @@ -131,13 +146,11 @@ HEALTHCHECK --interval=20s --timeout=10s --retries=3 \ 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 +FROM php:8.3-apache-bookworm AS apache-base ARG TIMEZONE RUN apt-get update && \ apt-get install -y \ @@ -158,8 +171,6 @@ EXPOSE 8001 HEALTHCHECK --interval=20s --timeout=10s --retries=3 \ CMD curl -f http://127.0.0.1:8001 || exit 1 - - ########################### # global base build ########################### @@ -172,8 +183,9 @@ RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${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 && \ + 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 @@ -181,28 +193,23 @@ COPY --from=composer /usr/bin/composer /usr/bin/composer # 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 +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-20220829/pdo_mysql.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/pdo_mysql.so +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-20220829/zip.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/zip.so +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-20220829/ldap.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ldap.so +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-20220829/gd.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/gd.so +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-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-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" ] - -# docker build -t kimai/kimai-base:fpm --build-arg BASE=fpm . -# docker build -t kimai/kimai-base:apache --build-arg BASE=apache . +CMD [ "/entrypoint.sh" ] \ No newline at end of file diff --git a/.docker/dbtest.php b/.docker/dbtest.php index 5b96e36f..24b4b714 100644 --- a/.docker/dbtest.php +++ b/.docker/dbtest.php @@ -6,9 +6,6 @@ $DATABASE_USER = urldecode($argv[4]); $DATABASE_PASS = urldecode($argv[5]); echo "Testing DB:"; -echo "*"; -echo "* new \PDO(mysql:host=$DATABASE_HOST;dbname=$DATABASE_BASE;port=$DATABASE_PORT, $DATABASE_USER, $DATABASE_PASS, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ]);"; -echo "*"; try { $pdo = new \PDO("mysql:host=$DATABASE_HOST;dbname=$DATABASE_BASE;port=$DATABASE_PORT", "$DATABASE_USER", "$DATABASE_PASS", [ diff --git a/.docker/self-test.sh b/.docker/self-test.sh deleted file mode 100755 index 8c4564ca..00000000 --- a/.docker/self-test.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/sh - -/startup.sh 2>&1 -echo $$ > /tmp/startup.pid -echo "Waiting for kimai to install" -while [ ! -f /opt/kimai/var/installed ]; do - echo -n ". " - sleep 5 -done -echo - -# Test FPM CGI -if [ -f /use_fpm ]; then - - export SCRIPT_NAME=/opt/kimai/public/index.php - export SCRIPT_FILENAME=/opt/kimai/public/index.php - export REQUEST_METHOD=GET - export SERVER_ADDR=localhost - - COUNT=0 - until cgi-fcgi -bind -connect 127.0.0.1:9000 &> /dev/null - do - COUNT=$((COUNT+1)) - echo "Waiting for FPM Server to start (${COUNT})" - sleep 3 - if [ "$COUNT" -gt 5 ]; then - echo "FPM Failed to start." - exit 1 - fi - done - -fi - -# Test Apache/httpd -if [ -f /use_apache ]; then - - COUNT=0 - until curl -s -o /dev/null http://localhost:8001 - do - COUNT=$((COUNT+1)) - echo "Waiting for Apache/HTTP to start (${COUNT})" &> /dev/null - sleep 3 - if [ "$COUNT" -gt 5 ]; then - echo "Apache/HTTP failed to start." - exit 1 - fi - done - -fi - -# Test PHP/Kimai -/opt/kimai/bin/console kimai:version -if [ $? != 0 ]; then - echo "PHP/Kimai not responding" - exit 1 -fi -kill $(cat /tmp/startup.pid) - - diff --git a/.docker/service.sh b/.docker/service.sh deleted file mode 100755 index 1bf10b47..00000000 --- a/.docker/service.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -x - -function waitForDB() { - # Parse sql connection data - DATABASE_USER=$(awk -F '[/:@]' '{print $4}' <<< "$DATABASE_URL") - DATABASE_PASS=$(awk -F '[/:@]' '{print $5}' <<< "$DATABASE_URL") - DATABASE_HOST=$(awk -F '[/:@]' '{print $6}' <<< "$DATABASE_URL") - DATABASE_PORT=$(awk -F '[/:@]' '{print $7}' <<< "$DATABASE_URL") - DATABASE_BASE=$(awk -F '[/?]' '{print $4}' <<< "$DATABASE_URL") - - re='^[0-9]+$' - if ! [[ $DATABASE_PORT =~ $re ]] ; then - DATABASE_PORT=3306 - fi - - echo "Wait for database connection ..." - until php /dbtest.php "$DATABASE_HOST" "$DATABASE_BASE" "$DATABASE_PORT" "$DATABASE_USER" "$DATABASE_PASS"; do - echo Checking DB: $? - sleep 3 - done - echo "Connection established" -} - -function handleStartup() { - # These are idempotent, so we can run them on every start-up - /opt/kimai/bin/console -n kimai:install - /opt/kimai/bin/console -n kimai:update - if [ ! -z "$ADMINPASS" ] && [ ! -a "$ADMINMAIL" ]; then - /opt/kimai/bin/console kimai:user:create admin "$ADMINMAIL" ROLE_SUPER_ADMIN "$ADMINPASS" - fi - echo "$KIMAI" > /opt/kimai/var/installed - echo "Kimai is ready" -} - -function runServer() { - # Just while I'm fixing things - /opt/kimai/bin/console kimai:reload --env="$APP_ENV" - chown -R $USER_ID:$GROUP_ID /opt/kimai/var - if [ -e /use_apache ]; then - exec /usr/sbin/apache2 -D FOREGROUND - elif [ -e /use_fpm ]; then - exec php-fpm - else - echo "Error, unknown server type" - fi -} - -waitForDB -handleStartup -runServer diff --git a/.docker/startup.sh b/.docker/startup.sh index f4545a7a..49e64f3a 100755 --- a/.docker/startup.sh +++ b/.docker/startup.sh @@ -3,12 +3,8 @@ KIMAI=$(cat /opt/kimai/version.txt) echo $KIMAI -function config() { - # set mem limits and copy in custom logger config - if [ -z "$memory_limit" ]; then - memory_limit=256M - fi - +function waitForDB() { + # Parse sql connection data DATABASE_USER=$(awk -F '[/:@]' '{print $4}' <<< "$DATABASE_URL") DATABASE_PASS=$(awk -F '[/:@]' '{print $5}' <<< "$DATABASE_URL") DATABASE_HOST=$(awk -F '[/:@]' '{print $6}' <<< "$DATABASE_URL") @@ -30,11 +26,12 @@ function config() { function handleStartup() { # set mem limits and copy in custom logger config + if [ -z "$memory_limit" ]; then + memory_limit=512M + fi sed -i "s/memory_limit.*/memory_limit=$memory_limit/g" /usr/local/etc/php/php.ini cp /assets/monolog.yaml /opt/kimai/config/packages/monolog.yaml - tar -zx -C /opt/kimai -f /var/tmp/public.tgz - if [ -z "$USER_ID" ]; then USER_ID=$(id -u www-data) fi @@ -76,7 +73,31 @@ function handleStartup() { fi } -config -handleStartup +function prepareKimai() { + # These are idempotent, so we can run them on every start-up + /opt/kimai/bin/console -n kimai:install + /opt/kimai/bin/console -n kimai:update + if [ ! -z "$ADMINPASS" ] && [ ! -a "$ADMINMAIL" ]; then + /opt/kimai/bin/console kimai:user:create admin "$ADMINMAIL" ROLE_SUPER_ADMIN "$ADMINPASS" + fi + echo "$KIMAI" > /opt/kimai/var/installed + echo "Kimai is ready" +} -exec /service.sh +function runServer() { + # Just while I'm fixing things + /opt/kimai/bin/console kimai:reload --env="$APP_ENV" + chown -R $USER_ID:$GROUP_ID /opt/kimai/var + if [ -e /use_apache ]; then + exec /usr/sbin/apache2 -D FOREGROUND + elif [ -e /use_fpm ]; then + exec php-fpm + else + echo "Error, unknown server type" + fi +} + +waitForDB +handleStartup +prepareKimai +runServer diff --git a/.github/workflows/docker-base.yaml b/.github/workflows/docker-base.yaml index e8d2c90e..63df4a17 100644 --- a/.github/workflows/docker-base.yaml +++ b/.github/workflows/docker-base.yaml @@ -31,9 +31,8 @@ jobs: uses: docker/build-push-action@v5 with: context: .docker - file: .docker/Dockerfile.kimai-base + file: .docker/Dockerfile build-args: | - TIMEZONE=Europe/London BASE=${{ matrix.server }} platforms: linux/amd64,linux/arm64 #,linux/arm/v8,linux/arm/v7,linux/arm/v6 tags: | diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 50d9ceda..99c96ba2 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -40,7 +40,6 @@ jobs: context: . build-args: | KIMAI=${{ env.kimai_version }} - TIMEZONE=Europe/London BASE=${{ matrix.server }} target: prod platforms: linux/amd64,linux/arm64 @@ -56,7 +55,6 @@ jobs: context: . build-args: | KIMAI=${{ env.kimai_version }} - TIMEZONE=Europe/London BASE=apache target: dev platforms: linux/amd64,linux/arm64 diff --git a/Dockerfile b/Dockerfile index b5656ab7..d47b738a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,11 +4,18 @@ # | . \| | | | | | | (_| | | # |_|\_\_|_| |_| |_|\__,_|_| # +# Kimai images for: +# - plain PHP FPM +# - Apache with PHP +# --------------------------------------------------------------------- +# 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 . +# --------------------------------------------------------------------- # Source base [fpm/apache] ARG BASE="fpm" -ARG PHP_VER="8.2" -ARG COMPOSER_VER="latest" # Branch name ARG KIMAI="main" # Timezone for images @@ -31,9 +38,10 @@ 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 @@ -65,12 +73,10 @@ RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > chown -R www-data:www-data /composer # copy startup script & DB checking script -COPY .docker/startup.sh /startup.sh -COPY .docker/service.sh /service.sh -COPY .docker/self-test.sh /self-test.sh COPY .docker/dbtest.php /dbtest.php +COPY .docker/startup.sh /startup.sh -ENV DATABASE_URL="mysql://kimai:kimai@127.0.0.1:3306/kimai?charset=utf8mb4&serverVersion=5.7.40" +ENV DATABASE_URL="mysql://kimai:kimai@127.0.0.1:3306/kimai?charset=utf8mb4&serverVersion=8.3" ENV APP_SECRET=change_this_to_something_unique # The default container name for nginx is nginx ENV TRUSTED_PROXIES=nginx,localhost,127.0.0.1 @@ -89,12 +95,11 @@ VOLUME [ "/opt/kimai/var" ] CMD [ "/startup.sh" ] - ########################### # final builds ########################### -# developement build +# development build FROM base AS dev # copy kimai develop source COPY --from=git-dev --chown=www-data:www-data /opt/kimai /opt/kimai @@ -111,11 +116,10 @@ RUN \ mkdir -p /opt/kimai/var/logs && chmod 777 /opt/kimai/var/logs && \ sed "s/128M/-1/g" /usr/local/etc/php/php.ini-development > /opt/kimai/php-cli.ini && \ sed -i "s/env php/env -S php -c \/opt\/kimai\/php-cli.ini/g" /opt/kimai/bin/console && \ - tar -C /opt/kimai -zcvf /var/tmp/public.tgz public && \ /opt/kimai/bin/console kimai:version | awk '{print $2}' > /opt/kimai/version.txt ENV APP_ENV=dev ENV DATABASE_URL= -ENV memory_limit=256M +ENV memory_limit=512M # production build FROM base AS prod @@ -139,8 +143,7 @@ RUN \ mkdir -p /opt/kimai/var/logs && chmod 777 /opt/kimai/var/logs && \ sed "s/128M/-1/g" /usr/local/etc/php/php.ini-development > /opt/kimai/php-cli.ini && \ chown -R www-data:www-data /opt/kimai /usr/local/etc/php/php.ini && \ - tar -C /opt/kimai -zcvf /var/tmp/public.tgz public && \ /opt/kimai/bin/console kimai:version | awk '{print $2}' > /opt/kimai/version.txt ENV APP_ENV=prod ENV DATABASE_URL= -ENV memory_limit=256M +ENV memory_limit=512M