Docker improvements (#5093)

This commit is contained in:
Kevin Papst
2024-10-04 10:25:46 +02:00
committed by GitHub
parent 52b949daa3
commit 855a546683
8 changed files with 91 additions and 175 deletions

View File

@@ -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" ]

View File

@@ -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", [

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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: |

View File

@@ -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

View File

@@ -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