mirror of
https://github.com/dunglas/frankenphp.git
synced 2025-12-24 13:38:11 +08:00
* feat: add fr doc (#1) * fix: fr translations * fix: linter * docs: various improvements * fix: md links on readme fr * fix: remove duplicate images --------- Co-authored-by: Kévin Dunglas <kevin@dunglas.fr>
166 lines
5.3 KiB
Markdown
166 lines
5.3 KiB
Markdown
# 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-<hash-du-commit-git>` sont également disponibles.
|