# Création d'une image Docker personnalisée Les images Docker de [FrankenPHP](https://hub.docker.com/r/dunglas/frankenphp) sont basées sur les [images PHP officielles](https://hub.docker.com/_/php/). Des variantes Debian et Alpine Linux sont fournies pour les architectures populaires. Les variantes Debian sont recommandées. Des variantes pour PHP 8.2 et PHP 8.3 sont disponibles. [Parcourir les tags](https://hub.docker.com/r/dunglas/frankenphp/tags). ## Comment utiliser les images Créez un `Dockerfile` dans votre projet : ```dockerfile FROM dunglas/frankenphp COPY . /app/public ``` Ensuite, exécutez ces commandes pour construire et exécuter l'image Docker : ```console docker build -t my-php-app . docker run -it --rm --name my-running-app my-php-app ``` ## Comment installer plus d'extensions PHP Le script [`docker-php-extension-installer`](https://github.com/mlocati/docker-php-extension-installer) est fourni dans l'image de base. Il est facile d'ajouter des extensions PHP supplémentaires : ```dockerfile FROM dunglas/frankenphp # ajoutez des extensions supplémentaires ici : RUN install-php-extensions \ pdo_mysql \ gd \ intl \ zip \ opcache ``` ## Comment installer plus de modules Caddy FrankenPHP est construit sur Caddy, et tous les [modules Caddy](https://caddyserver.com/docs/modules/) peuvent être utilisés avec FrankenPHP. La manière la plus simple d'installer des modules Caddy personnalisés est d'utiliser [xcaddy](https://github.com/caddyserver/xcaddy): ```dockerfile FROM dunglas/frankenphp:latest-builder AS builder # Copier xcaddy dans l'image du constructeur COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy # CGO doit être activé pour construire FrankenPHP ENV CGO_ENABLED=1 XCADDY_SETCAP=1 XCADDY_GO_BUILD_FLAGS="-ldflags '-w -s'" RUN xcaddy build \ --output /usr/local/bin/frankenphp \ --with github.com/dunglas/frankenphp=./ \ --with github.com/dunglas/frankenphp/caddy=./caddy/ \ # Mercure et Vulcain sont inclus dans la construction officielle, mais n'hésitez pas à les retirer --with github.com/dunglas/mercure/caddy \ --with github.com/dunglas/vulcain/caddy # Ajoutez des modules Caddy supplémentaires ici FROM dunglas/frankenphp AS runner # Remplacer le binaire officiel par celui contenant vos modules personnalisés COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp ``` L'image builder fournie par FrankenPHP contient une version compilée de `libphp`. [Les images builder](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) sont fournies pour toutes les versions de FrankenPHP et PHP, à la fois pour Debian et Alpine. > [!TIP] > > Si vous utilisez Alpine Linux et Symfony, > vous devrez peut-être [augmenter la taille de pile par défaut](compile.md#using-xcaddy). ## Activer le mode Worker par défaut Définissez la variable d'environnement `FRANKENPHP_CONFIG` pour démarrer FrankenPHP avec un script worker : ```dockerfile FROM dunglas/frankenphp # ... ENV FRANKENPHP_CONFIG="worker ./public/index.php" ``` ## Utiliser un volume en développement Pour développer facilement avec FrankenPHP, montez le répertoire de l'hôte contenant le code source de l'application comme un volume dans le conteneur Docker : ```console docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-app ``` > ![TIP] > > L'option --tty permet d'avoir des logs lisibles par un humain au lieu de logs JSON. Avec Docker Compose : ```yaml # compose.yaml services: php: image: dunglas/frankenphp # décommentez la ligne suivante si vous souhaitez utiliser un Dockerfile personnalisé #build: . # décommentez la ligne suivante si vous souhaitez exécuter ceci dans un environnement de production # restart: always ports: - "80:80" # HTTP - "443:443" # HTTPS - "443:443/udp" # HTTP/3 volumes: - ./:/app/public - caddy_data:/data - caddy_config:/config # commentez la ligne suivante en production, elle permet d'avoir de beaux logs lisibles en dev tty: true # Volumes nécessaires pour les certificats et la configuration de Caddy volumes: caddy_data: caddy_config: ``` ## Exécution en tant qu'utilisateur non-root FrankenPHP peut s'exécuter en tant qu'utilisateur non-root dans Docker. Voici un exemple de `Dockerfile` le permettant : ```dockerfile FROM dunglas/frankenphp ARG USER=www-data RUN \ # Utilisez "adduser -D ${USER}" pour les distributions basées sur Alpine useradd -D ${USER}; \ # Ajouter la capacité supplémentaire de se lier aux ports 80 et 443 setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \ # Donner l'accès en écriture à /data/caddy et /config/caddy chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy; USER ${USER} ``` ## Mises à jour Les images Docker sont construites : * lorsqu'une nouvelle version est taguée * tous les jours à 4h UTC, si de nouvelles versions des images officielles PHP sont disponibles ## Versions de développement Les versions de développement sont disponibles dans le dépôt Docker [`dunglas/frankenphp-dev`](https://hub.docker.com/repository/docker/dunglas/frankenphp-dev). Un nouveau build est déclenché chaque fois qu'un commit est poussé sur la branche principale du dépôt GitHub. Les tags `latest*` pointent vers la tête de la branche `main`. Les tags sous la forme `sha-` sont également disponibles.