From c7134611e765d0663fc7b9127f80c7cc692be10e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A8ve=20Caillault?= Date: Tue, 9 Jun 2026 06:22:03 +0200 Subject: [PATCH] Initialisation du projet. --- .env.example | 25 +++++++++ .gitignore | 1 + Dockerfile | 73 +++++++++++++++++++++++++++ README.md | 29 +++++++++++ scripts/build-docker-image.sh | 95 +++++++++++++++++++++++++++++++++++ 5 files changed, 223 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100755 scripts/build-docker-image.sh diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d16dbfb --- /dev/null +++ b/.env.example @@ -0,0 +1,25 @@ +# À définir pour éviter les problèmes sur les multi-projets Docker +COMPOSE_PROJECT_NAME="docker_php_image" + +# Définitions des labels pour la publication de l'image +SERVER_IMAGE_TITLE_LABEL="" +SERVER_IMAGE_DESCRIPTION_LABEL="" + +# Repository de l'image Docker +SERVER_IMAGE_REPOSITORY="" + +# Apache +APACHE_PHP_IMAGE="php:8.5-apache" + +# FrankenPHP +FRANKENPHP_IMAGE="dunglas/frankenphp:1.11.2-php8.5" + +# Image du serveur PHP +#SERVER_PHP_IMAGE="${APACHE_PHP_IMAGE}" +SERVER_PHP_IMAGE="${FRANKENPHP_IMAGE}" + +# Installation de Memcached +WITH_MEMCACHED="true" + +# Installation de Redis +WITH_REDIS="true" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b7c3367 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,73 @@ +ARG SERVER_PHP_IMAGE=unknown +ARG COMPOSER_IMAGE=composer:latest +ARG SERVER_IMAGE_TITLE_LABEL=unknown +ARG SERVER_IMAGE_DESCRIPTION_LABEL=unknown + +# Image Composer +FROM ${COMPOSER_IMAGE} AS php_composer + +# Image du serveur PHP à utiliser (Apache, FrankenPHP...) +FROM ${SERVER_PHP_IMAGE} + +ARG SERVER_IMAGE_TITLE_LABEL +ARG SERVER_IMAGE_DESCRIPTION_LABEL + +LABEL org.opencontainers.image.title="${SERVER_IMAGE_TITLE_LABEL}" +LABEL org.opencontainers.image.description="${SERVER_IMAGE_DESCRIPTION_LABEL}" + +# Installation de Composer +COPY --from=php_composer /usr/bin/composer /usr/local/bin/composer + +# Activation du mode rewrite d'Apache +ARG SERVER_PHP_IMAGE +RUN if echo "$SERVER_PHP_IMAGE" | grep -qi apache; then \ + a2enmod rewrite headers; \ + fi + +RUN apt-get update && apt-get install -y \ + nano \ + git \ + mariadb-client \ + npm \ + # Pour l'extension PHP intl + libicu-dev \ + # Zip + unzip zip libzip-dev zlib1g-dev \ + # GD + libpng-dev libjpeg-dev libwebp-dev libavif-dev libfreetype6-dev \ + && docker-php-ext-configure gd \ + --with-freetype \ + --with-jpeg \ + --with-webp \ + --with-avif \ + && docker-php-ext-install zip pdo_mysql gd sockets intl \ + # Installation de PIE (PHP Installer for Extensions : https://github.com/php/pie) + && curl -fL --output /tmp/pie.phar https://github.com/php/pie/releases/latest/download/pie.phar \ + && mv /tmp/pie.phar /usr/local/bin/pie \ + && chmod +x /usr/local/bin/pie + +# Installation de Memcached +ARG WITH_MEMCACHED=false +RUN if [ "$WITH_MEMCACHED" = "true" ]; then \ + apt-get install -y libmemcached-dev; \ + pie install php-memcached/php-memcached; \ + fi + +# Installation de Redis +ARG WITH_REDIS=false +RUN if [ "$WITH_REDIS" = "true" ]; then \ + pie install phpredis/phpredis; \ + fi + +RUN apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN usermod -u 1000 www-data && groupmod -g 1000 www-data + +# Configuration pour Composer +RUN mkdir -p /var/www/.cache/composer && chown -R www-data:www-data /var/www/.cache +ENV COMPOSER_CACHE_DIR=/var/www/.cache/composer + +# Configuration de NPM +RUN mkdir -p /var/www/.npm && chown -R www-data:www-data /var/www/.npm +ENV NPM_CONFIG_CACHE=/var/www/.npm diff --git a/README.md b/README.md new file mode 100644 index 0000000..c2c8425 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ + +# Image Docker PHP + +Cette image Docker fournit un environnement PHP basé sur l'un des serveurs suivants : + +* Apache +* FrankenPHP + +## Configuration + +Le serveur PHP utilisé est défini en utilisant la variable d'environnement `SERVER_PHP_IMAGE` dans le fichier `.env`. +La variable `SERVER_IMAGE_REPOSITORY` doit également être renseignée afin de définir le tag de l'image Docker. + +## Construction de l'image + +Le script `./scripts/build-docker-image.sh` génère automatiquement la commande de construction Docker en fonction de la valeur de `SERVER_PHP_IMAGE`. + +Exemple : + +```bash +./scripts/build-docker-image.sh --debug --build +``` + +### Options + +| Option | Description | +| --------- | ------------------------------------------------------ | +| `--debug` | Affiche la commande de construction de l'image. | +| `--build` | Exécute la construction de l'image Docker. | diff --git a/scripts/build-docker-image.sh b/scripts/build-docker-image.sh new file mode 100755 index 0000000..d75ea3d --- /dev/null +++ b/scripts/build-docker-image.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash + +# ./scripts/build-docker-image.sh --debug --build + +# Charge le fichier .env +rootDir=$(dirname "$BASH_SOURCE") +source $rootDir/../.env + +isApache=false +isFrankenphp=false +phpVersion="" +serverVersion="" +serverName="" +withDebug=false +withBuild=false + +for arg in "$@"; do + case "$arg" in + --debug) + withDebug=true + ;; + --build) + withBuild=true + ;; + esac +done + +# Vérifie que le repository de l'image est définie +if [[ "$SERVER_IMAGE_REPOSITORY" == "" ]]; then + echo "Le repository de l'image est inconnu. Veuillez définir la variable d'environnement SERVER_IMAGE_REPOSITORY." + exit 1 +fi + +# Détermine si l'image du serveur est Apache ou FrankenPHP +if [[ "$SERVER_PHP_IMAGE" == *"apache"* ]]; then + isApache=true + phpVersion="${SERVER_PHP_IMAGE#*:}" + phpVersion="${phpVersion%%-*}" + serverVersion="2.4" + serverName="Apache" +fi + +if [[ "$SERVER_PHP_IMAGE" == *"frankenphp"* ]]; then + isFrankenphp=true + phpVersion="${SERVER_PHP_IMAGE##*-php}" + serverVersion="${SERVER_PHP_IMAGE#*:}" + serverVersion="${serverVersion%%-*}" + serverName="FrankenPHP" +fi + +# Vérifie le numéro de la version PHP +if [[ ! "$phpVersion" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then + echo "Version de PHP incorrecte : $phpVersion" + exit 1 +fi + +# Vérifie le numéro de la version du serveur +if [[ ! "$serverVersion" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then + echo "Version du serveur incorrecte : $serverVersion" + exit 1 +fi + +# Détermine le titre de l'image +serverImageTitleLabel="Image PHP :phpVersion avec :serverName :serverVersion" +serverImageTitleLabel=${serverImageTitleLabel/:phpVersion/${phpVersion}} +serverImageTitleLabel=${serverImageTitleLabel/:serverName/${serverName}} +serverImageTitleLabel=${serverImageTitleLabel/:serverVersion/${serverVersion}} + +# Détermine la description de l'image +serverImageDescriptionLabel="Installation d'un serveur :serverName avec la version :phpVersion de PHP. Inclus dans l'image : Composer, Node, NPM, MariaDB, Memchached, Redis et PIE (PHP Installer for Extensions)." +serverImageDescriptionLabel=${serverImageDescriptionLabel/:phpVersion/${phpVersion}} +serverImageDescriptionLabel=${serverImageDescriptionLabel/:serverName/${serverName}} + +# Détermine le tag de l'image +dockerImageTag="${SERVER_IMAGE_REPOSITORY}:${phpVersion}-${serverName,,}-${serverVersion}" + +buildCommand="docker build \ + -f Dockerfile \ + -t ${dockerImageTag} \ + --build-arg SERVER_PHP_IMAGE=${SERVER_PHP_IMAGE} \ + --build-arg SERVER_IMAGE_TITLE_LABEL=\"${serverImageTitleLabel}\" \ + --build-arg SERVER_IMAGE_DESCRIPTION_LABEL=\"${serverImageDescriptionLabel}\" \ + --build-arg WITH_MEMCACHED=true \ + --build-arg WITH_REDIS=true \ + . +" + +if [[ "$withDebug" == "true" ]]; then + echo $buildCommand +fi + +if [[ "$withBuild" == "true" ]]; then + eval "$buildCommand" + echo "Build de l'image ${phpVersion}-${serverName,,}-${serverVersion} terminé." +fi