Skip to content

Commit 9008b7b

Browse files
github-actions[bot]alexandre-dauboishenderkesCopilotCopilot
authored
docs: update translations (#2230)
Translation updates for: docker.md . --------- Signed-off-by: Marc <m@pyc.ac> Signed-off-by: Alexandre Daubois <2144837+alexandre-daubois@users.noreply.github.com> Co-authored-by: alexandre-daubois <2144837+alexandre-daubois@users.noreply.github.com> Co-authored-by: Marc <m@pyc.ac> Co-authored-by: Alexandre Daubois <alex.daubois@gmail.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent ebc7ef0 commit 9008b7b

File tree

6 files changed

+611
-145
lines changed

6 files changed

+611
-145
lines changed

docs/cn/docker.md

Lines changed: 100 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
# 构建自定义 Docker 镜像
22

3-
[FrankenPHP Docker 镜像](https://hub.docker.com/r/dunglas/frankenphp) 基于 [官方 PHP 镜像](https://hub.docker.com/_/php/)。提供适用于流行架构的 Debian 和 Alpine Linux 变体。推荐使用 Debian 变体。
3+
[FrankenPHP Docker 镜像](https://hub.docker.com/r/dunglas/frankenphp) 基于 [官方 PHP 镜像](https://hub.docker.com/_/php/)
4+
提供适用于流行架构的 Debian 和 Alpine Linux 变体。
5+
推荐使用 Debian 变体。
46

57
提供 PHP 8.2、8.3、8.4 和 8.5 的变体。
68

79
标签遵循此模式:`dunglas/frankenphp:<frankenphp-version>-php<php-version>-<os>`
810

911
- `<frankenphp-version>``<php-version>` 分别是 FrankenPHP 和 PHP 的版本号,范围从主版本(例如 `1`)、次版本(例如 `1.2`)到补丁版本(例如 `1.2.3`)。
10-
- `<os>` 要么是 `bookworm`(用于 Debian Bookworm)要么是 `alpine`(用于 Alpine 的最新稳定版本)。
12+
- `<os>` 要么是 `trixie`(用于 Debian Trixie),`bookworm`(用于 Debian Bookworm)要么是 `alpine`(用于 Alpine 的最新稳定版本)。
1113

1214
[浏览标签](https://hub.docker.com/r/dunglas/frankenphp/tags)
1315

@@ -28,6 +30,10 @@ docker build -t my-php-app .
2830
docker run -it --rm --name my-running-app my-php-app
2931
```
3032

33+
## 如何调整配置
34+
35+
为了方便,镜像中提供了一个包含有用环境变量的[默认 `Caddyfile`](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile)
36+
3137
## 如何安装更多 PHP 扩展
3238

3339
[`docker-php-extension-installer`](https://github.com/mlocati/docker-php-extension-installer) 脚本在基础镜像中提供。
@@ -79,13 +85,11 @@ FROM dunglas/frankenphp AS runner
7985
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
8086
```
8187

82-
FrankenPHP 提供的 `builder` 镜像包含 `libphp` 的编译版本。
83-
[用于构建的镜像](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) 适用于所有版本的 FrankenPHP 和 PHP,包括 Alpine 和 Debian。
88+
FrankenPHP 提供的[构建器镜像](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder)适用于所有版本的 FrankenPHP 和 PHP,同时支持 Debian 和 Alpine。
8489

8590
> [!TIP]
8691
>
87-
> 如果你的系统基于 musl libc(Alpine Linux 上默认使用)并搭配 Symfony 使用,
88-
> 你可能需要 [增加默认堆栈大小](compile.md#using-xcaddy)
92+
> 如果你正在使用 Alpine Linux 和 Symfony,你可能需要[增加默认堆栈大小](compile.md#using-xcaddy)
8993
9094
## 默认启用 worker 模式
9195

@@ -99,17 +103,17 @@ FROM dunglas/frankenphp
99103
ENV FRANKENPHP_CONFIG="worker ./public/index.php"
100104
```
101105

102-
## 开发挂载宿主机目录
106+
## 在开发中使用卷
103107

104-
要使用 FrankenPHP 轻松开发,请从包含应用程序源代码的主机挂载目录作为 Docker 容器中的 volume
108+
要使用 FrankenPHP 轻松开发,请从包含应用程序源代码的主机挂载目录作为 Docker 容器中的卷
105109

106110
```console
107111
docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-app
108112
```
109113

110114
> [!TIP]
111115
>
112-
> `--tty` 选项允许使用清晰可读的日志,而不是 JSON 日志。
116+
> `--tty` 选项允许使用易读的日志,而不是 JSON 日志。
113117
114118
使用 Docker Compose:
115119

@@ -131,10 +135,10 @@ services:
131135
- ./:/app/public
132136
- caddy_data:/data
133137
- caddy_config:/config
134-
# 在生产环境中注释以下行,它允许在 dev 中使用清晰可读日志
138+
# 在生产环境中注释以下行,它允许在开发环境中使用易读日志
135139
tty: true
136140

137-
# Caddy 证书和配置所需的挂载目录
141+
# Caddy 证书和配置所需的数据卷
138142
volumes:
139143
caddy_data:
140144
caddy_config:
@@ -152,35 +156,35 @@ FROM dunglas/frankenphp
152156
ARG USER=appuser
153157
154158
RUN \
155-
# 在基于 alpine 的发行版使用 "adduser -D ${USER}"
159+
# 在基于 Alpine 的发行版使用 "adduser -D ${USER}"
156160
useradd ${USER}; \
157-
# 需要开放80和443端口的权限
161+
# 添加绑定到 80 和 443 端口的额外能力
158162
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \
159-
# 需要 /config/caddy 和 /data/caddy 目录的写入权限
163+
# 赋予 /config/caddy 和 /data/caddy 目录的写入权限
160164
chown -R ${USER}:${USER} /config/caddy /data/caddy
161165
162166
USER ${USER}
163167
```
164168

165-
### 无权限运行
169+
### 在不使用能力的情况下运行
166170

167-
即使在无根运行时,FrankenPHP 也需要 `CAP_NET_BIND_SERVICE` 权限来将
171+
即使在无根运行时,FrankenPHP 也需要 `CAP_NET_BIND_SERVICE` 能力来将
168172
Web 服务器绑定到特权端口(80 和 443)。
169173

170174
如果你在非特权端口(1024 及以上)上公开 FrankenPHP,则可以以非 root 用户身份运行
171-
Web 服务器,并且不需要任何权限
175+
Web 服务器,并且不需要任何能力
172176

173177
```dockerfile
174178
FROM dunglas/frankenphp
175179
176180
ARG USER=appuser
177181
178182
RUN \
179-
# 在基于 alpine 的发行版使用 "adduser -D ${USER}"
183+
# 在基于 Alpine 的发行版使用 "adduser -D ${USER}"
180184
useradd ${USER}; \
181-
# 移除默认权限
185+
# 移除默认能力
182186
setcap -r /usr/local/bin/frankenphp; \
183-
# 给予 /config/caddy 和 /data/caddy 写入权限
187+
# 赋予 /config/caddy 和 /data/caddy 目录的写入权限
184188
chown -R ${USER}:${USER} /config/caddy /data/caddy
185189
186190
USER ${USER}
@@ -191,14 +195,85 @@ USER ${USER}
191195

192196
## 更新
193197

194-
Docker 镜像会按照以下条件更新
198+
Docker 镜像会在以下情况下构建
195199

196200
- 发布新的版本后
197-
- 每日 4:00(UTC 时间)检查新的 PHP 镜像
201+
- 每日 UTC 时间上午 4 点,如果新的官方 PHP 镜像可用
202+
203+
## 强化镜像
204+
205+
为了进一步减少 FrankenPHP Docker 镜像的攻击面和大小,还可以基于 [Google distroless](https://github.com/GoogleContainerTools/distroless) 或 [Docker hardened](https://www.docker.com/products/hardened-images) 镜像构建它们。
206+
207+
> [!WARNING]
208+
> 这些最小化的基础镜像不包含 shell 或包管理器,这使得调试更加困难。因此,仅在安全性优先级很高的情况下,才推荐将其用于生产环境。
209+
210+
当添加额外的 PHP 扩展时,你需要一个中间构建阶段:
211+
212+
```dockerfile
213+
FROM dunglas/frankenphp AS builder
214+
215+
# 在此处添加额外的 PHP 扩展
216+
RUN install-php-extensions pdo_mysql pdo_pgsql #...
217+
218+
# 将 frankenphp 和所有已安装扩展的共享库复制到临时位置
219+
# 你也可以通过分析 frankenphp 二进制文件和每个扩展 .so 文件的 ldd 输出手动执行此步骤
220+
RUN apt-get update && apt-get install -y libtree && \
221+
EXT_DIR="$(php -r 'echo ini_get("extension_dir");')" && \
222+
FRANKENPHP_BIN="$(which frankenphp)"; \
223+
LIBS_TMP_DIR="/tmp/libs"; \
224+
mkdir -p "$LIBS_TMP_DIR"; \
225+
for target in "$FRANKENPHP_BIN" $(find "$EXT_DIR" -maxdepth 2 -type f -name "*.so"); do \
226+
libtree -pv "$target" | sed 's/.*── \(.*\) \[.*/\1/' | grep -v "^$target" | while IFS= read -r lib; do \
227+
[ -z "$lib" ] && continue; \
228+
base=$(basename "$lib"); \
229+
destfile="$LIBS_TMP_DIR/$base"; \
230+
if [ ! -f "$destfile" ]; then \
231+
cp "$lib" "$destfile"; \
232+
fi; \
233+
done; \
234+
done
235+
236+
237+
# Distroless debian 基础镜像,确保它与基础镜像使用相同的 debian 版本
238+
FROM gcr.io/distroless/base-debian13
239+
# Docker hardened 镜像替代方案
240+
# FROM dhi.io/debian:13
241+
242+
# 你的应用程序和 Caddyfile 要复制到容器中的位置
243+
ARG PATH_TO_APP="."
244+
ARG PATH_TO_CADDYFILE="./Caddyfile"
245+
246+
# 将你的应用程序复制到 /app
247+
# 为了进一步强化,请确保只有可写路径由非 root 用户拥有
248+
COPY --chown=nonroot:nonroot "$PATH_TO_APP" /app
249+
COPY "$PATH_TO_CADDYFILE" /etc/caddy/Caddyfile
250+
251+
# 复制 frankenphp 和必要的库
252+
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
253+
COPY --from=builder /usr/local/lib/php/extensions /usr/local/lib/php/extensions
254+
COPY --from=builder /tmp/libs /usr/lib
255+
256+
# 复制 php.ini 配置文件
257+
COPY --from=builder /usr/local/etc/php/conf.d /usr/local/etc/php/conf.d
258+
COPY --from=builder /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
259+
260+
# Caddy 数据目录——即使在只读根文件系统上,也必须对非 root 用户可写
261+
ENV XDG_CONFIG_HOME=/config \
262+
XDG_DATA_HOME=/data
263+
COPY --from=builder --chown=nonroot:nonroot /data/caddy /data/caddy
264+
COPY --from=builder --chown=nonroot:nonroot /config/caddy /config/caddy
265+
266+
USER nonroot
267+
268+
WORKDIR /app
269+
270+
# 运行 frankenphp 并使用提供的 Caddyfile 的入口点
271+
ENTRYPOINT ["/usr/local/bin/frankenphp", "run", "-c", "/etc/caddy/Caddyfile"]
272+
```
198273

199274
## 开发版本
200275

201-
可在此 [`dunglas/frankenphp-dev`](https://hub.docker.com/repository/docker/dunglas/frankenphp-dev) 仓库获取开发版本
202-
每次在 GitHub 仓库的主分支有新的 commit 都会触发一次新的 build
276+
开发版本可在 [`dunglas/frankenphp-dev`](https://hub.docker.com/repository/docker/dunglas/frankenphp-dev) Docker 仓库中获取
277+
每次将新的提交推送到 GitHub 仓库的主分支时,都会触发一次新的构建
203278

204-
`latest*` tag 指向最新的 `main` 分支,且同样支持 `sha-<git-commit-hash>` 的 tag
279+
`latest*` 标签指向 `main` 分支的 HEAD。形式为 `sha-<git-commit-hash>` 的标签也可用

docs/fr/docker.md

Lines changed: 89 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ Les images Docker de [FrankenPHP](https://hub.docker.com/r/dunglas/frankenphp) s
44

55
Des variantes pour PHP 8.2, 8.3, 8.4 et 8.5 sont disponibles. [Parcourir les tags](https://hub.docker.com/r/dunglas/frankenphp/tags).
66

7-
Les tags suivent le pattern suivant: `dunglas/frankenphp:<frankenphp-version>-php<php-version>-<os>`
7+
Les tags suivent le pattern suivant : `dunglas/frankenphp:<frankenphp-version>-php<php-version>-<os>`
88

9-
- `<frankenphp-version>` et `<php-version>` sont repsectivement les numéros de version de FrankenPHP et PHP, allant de majeur (e.g. `1`), mineur (e.g. `1.2`) à des versions correctives (e.g. `1.2.3`).
10-
- `<os>` est soit `trixie` (pour Debian Trixie), `bookworm` (pour Debian Bookworm) ou `alpine` (pour la dernière version stable d'Alpine).
9+
- `<frankenphp-version>` et `<php-version>` sont respectivement les numéros de version de FrankenPHP et PHP, allant de majeur (e.g. `1`), mineur (e.g. `1.2`) à des versions correctives (e.g. `1.2.3`).
10+
- `<os>` est soit `trixie` (pour Debian Trixie), `bookworm` (pour Debian Bookworm), ou `alpine` (pour la dernière version stable d'Alpine).
1111

1212
[Parcourir les tags](https://hub.docker.com/r/dunglas/frankenphp/tags).
1313

@@ -28,10 +28,13 @@ docker build -t my-php-app .
2828
docker run -it --rm --name my-running-app my-php-app
2929
```
3030

31+
## Comment ajuster la configuration
32+
33+
Pour une meilleure expérience initiale, un [`Caddyfile` par défaut](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile) contenant des variables d'environnement communément utilisées est fourni dans l'image.
34+
3135
## Comment installer plus d'extensions PHP
3236

33-
Le script [`docker-php-extension-installer`](https://github.com/mlocati/docker-php-extension-installer) est fourni dans l'image de base.
34-
Il est facile d'ajouter des extensions PHP supplémentaires :
37+
Le script [`docker-php-extension-installer`](https://github.com/mlocati/docker-php-extension-installer) est fourni dans l'image de base. L'ajout d'extensions PHP supplémentaires se fait de cette manière :
3538

3639
```dockerfile
3740
FROM dunglas/frankenphp
@@ -79,7 +82,7 @@ FROM dunglas/frankenphp AS runner
7982
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
8083
```
8184

82-
L'image builder fournie par FrankenPHP contient une version compilée de `libphp`.
85+
L'image `builder` fournie par FrankenPHP contient une version compilée de `libphp`.
8386
[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.
8487

8588
> [!TIP]
@@ -156,18 +159,17 @@ RUN \
156159
useradd ${USER}; \
157160
# Ajouter la capacité supplémentaire de se lier aux ports 80 et 443
158161
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \
159-
# Donner l'accès en écriture à /data/caddy et /config/caddy
160-
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
162+
# Donner l'accès en écriture à /config/caddy et /data/caddy
163+
chown -R ${USER}:${USER} /config/caddy /data/caddy
161164
162165
USER ${USER}
163166
```
164167

165168
### Exécution sans capacité
166169

167-
Même lorsqu'il s'exécute en tant qu'utilisateur autre que root, FrankenPHP a besoin de la capacité `CAP_NET_BIND_SERVICE`
168-
pour que son serveur utilise les ports privilégiés (80 et 443).
170+
Même lorsqu'il s'exécute en tant qu'utilisateur non-root, FrankenPHP a besoin de la capacité `CAP_NET_BIND_SERVICE` pour lier le serveur web sur les ports privilégiés (80 et 443).
169171

170-
Si vous exposez FrankenPHP sur un port non privilégié (à partir de 1024), il est possible de faire fonctionner le serveur web avec un utilisateur qui n'est pas root, et sans avoir besoin d'aucune capacité.
172+
Si vous exposez FrankenPHP sur un port non privilégié (1024 et au-delà), il est possible d'exécuter le serveur web en tant qu'utilisateur non-root, et sans avoir besoin d'aucune capacité :
171173

172174
```dockerfile
173175
FROM dunglas/frankenphp
@@ -177,16 +179,16 @@ ARG USER=appuser
177179
RUN \
178180
# Utiliser "adduser -D ${USER}" pour les distros basées sur Alpine
179181
useradd ${USER}; \
180-
# Supprimer la capacité par défaut \
182+
# Supprimer la capacité par défaut
181183
setcap -r /usr/local/bin/frankenphp; \
182-
# Donner un accès en écriture à /data/caddy et /config/caddy \
183-
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
184+
# Donner un accès en écriture à /config/caddy et /data/caddy
185+
chown -R ${USER}:${USER} /config/caddy /data/caddy
184186
185187
USER ${USER}
186188
```
187189

188190
Ensuite, définissez la variable d'environnement `SERVER_NAME` pour utiliser un port non privilégié.
189-
Exemple `:8000`
191+
Exemple : `:8000`
190192

191193
## Mises à jour
192194

@@ -195,9 +197,80 @@ Les images Docker sont construites :
195197
- lorsqu'une nouvelle version est taguée
196198
- tous les jours à 4h UTC, si de nouvelles versions des images officielles PHP sont disponibles
197199

200+
## Durcir la sécurité des images
201+
202+
Pour réduire davantage la surface d'attaque et la taille de vos images Docker FrankenPHP, il est également possible de les construire sur une image [Google distroless](https://github.com/GoogleContainerTools/distroless) ou [Docker hardened](https://www.docker.com/products/hardened-images).
203+
204+
> [!WARNING]
205+
> Ces images de base minimales n'incluent pas de shell ou de gestionnaire de paquets, ce qui rend le débogage plus difficile. Elles sont donc recommandées uniquement pour la production si la sécurité est une priorité.
206+
207+
Lors de l'ajout d'extensions PHP supplémentaires, vous aurez besoin d'une étape de build intermédiaire :
208+
209+
```dockerfile
210+
FROM dunglas/frankenphp AS builder
211+
212+
# Ajoutez ici des extensions PHP supplémentaires
213+
RUN install-php-extensions pdo_mysql pdo_pgsql #...
214+
215+
# Copiez les bibliothèques partagées de frankenphp et toutes les extensions installées vers un emplacement temporaire
216+
# Vous pouvez également effectuer cette étape manuellement en analysant la sortie ldd du binaire frankenphp et de chaque fichier .so d'extension
217+
RUN apt-get update && apt-get install -y libtree && \
218+
EXT_DIR="$(php -r 'echo ini_get("extension_dir");')" && \
219+
FRANKENPHP_BIN="$(which frankenphp)"; \
220+
LIBS_TMP_DIR="/tmp/libs"; \
221+
mkdir -p "$LIBS_TMP_DIR"; \
222+
for target in "$FRANKENPHP_BIN" $(find "$EXT_DIR" -maxdepth 2 -type f -name "*.so"); do \
223+
libtree -pv "$target" | sed 's/.*── \(.*\) \[.*/\1/' | grep -v "^$target" | while IFS= read -r lib; do \
224+
[ -z "$lib" ] && continue; \
225+
base=$(basename "$lib"); \
226+
destfile="$LIBS_TMP_DIR/$base"; \
227+
if [ ! -f "$destfile" ]; then \
228+
cp "$lib" "$destfile"; \
229+
fi; \
230+
done; \
231+
done
232+
233+
234+
# Image de base Debian distroless, assurez-vous que c'est la même version de Debian que l'image de base
235+
FROM gcr.io/distroless/base-debian13
236+
# Alternative d'image Docker renforcée
237+
# FROM dhi.io/debian:13
238+
239+
# Emplacement de votre application et du Caddyfile à copier dans le conteneur
240+
ARG PATH_TO_APP="."
241+
ARG PATH_TO_CADDYFILE="./Caddyfile"
242+
243+
# Copiez votre application dans /app
244+
# Pour un durcissement supplémentaire, assurez-vous que seuls les chemins accessibles en écriture sont détenus par l'utilisateur non-root
245+
COPY --chown=nonroot:nonroot "$PATH_TO_APP" /app
246+
COPY "$PATH_TO_CADDYFILE" /etc/caddy/Caddyfile
247+
248+
# Copiez frankenphp et les bibliothèques nécessaires
249+
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
250+
COPY --from=builder /usr/local/lib/php/extensions /usr/local/lib/php/extensions
251+
COPY --from=builder /tmp/libs /usr/lib
252+
253+
# Copiez les fichiers de configuration php.ini
254+
COPY --from=builder /usr/local/etc/php/conf.d /usr/local/etc/php/conf.d
255+
COPY --from=builder /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
256+
257+
# Répertoires de données Caddy — doivent être accessibles en écriture pour l'utilisateur non-root, même sur un système de fichiers racine en lecture seule
258+
ENV XDG_CONFIG_HOME=/config \
259+
XDG_DATA_HOME=/data
260+
COPY --from=builder --chown=nonroot:nonroot /data/caddy /data/caddy
261+
COPY --from=builder --chown=nonroot:nonroot /config/caddy /config/caddy
262+
263+
USER nonroot
264+
265+
WORKDIR /app
266+
267+
# Point d'entrée pour exécuter frankenphp avec le Caddyfile fourni
268+
ENTRYPOINT ["/usr/local/bin/frankenphp", "run", "-c", "/etc/caddy/Caddyfile"]
269+
```
270+
198271
## Versions de développement
199272

200273
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.
201274

202275
Les tags `latest*` pointent vers la tête de la branche `main`.
203-
Les tags sous la forme `sha-<hash-du-commit-git>` sont également disponibles.
276+
Les tags sous la forme `sha-<git-commit-hash>` sont également disponibles.

0 commit comments

Comments
 (0)