Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

ENV LANG=fr_FR.UTF-8 dans un Dockerfile transmet une variable d’environnement ; cela ne garantit ni que la locale française est installée dans l’image, ni que le processus PHP l’a appliquée. Pour trouver pourquoi PHP voit C.UTF-8, vérifiez successivement la locale disponible dans le conteneur, les variables réellement reçues par PHP et le résultat de setlocale().

Pourquoi la valeur LANG ne suffit pas

Trois états différents sont souvent confondus : la valeur de LANG dans l’environnement, les données de locale installées dans l’image et la locale effectivement utilisée par le processus PHP. La directive Docker ENV définit une variable conservée dans l’environnement de l’image et des conteneurs qui en sont issus, mais elle ne génère pas les données système de la locale correspondante (documentation Docker sur ENV).

Sur les images officielles Debian, les locales disponibles par défaut comprennent C, C.UTF-8 et POSIX. Une locale comme fr_FR.UTF-8 doit être générée si elle n’est pas déjà présente. PHP, de son côté, ne choisit pas nécessairement la locale souhaitée parce que la variable existe : il faut demander au processus de la lire avec setlocale() et contrôler le résultat (image officielle Debian, manuel PHP de setlocale).

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Ce que signifie C.UTF-8 par rapport à fr_FR.UTF-8

C.UTF-8 conserve le comportement de la locale C tout en prenant en charge l’encodage UTF-8. Ce n’est pas une locale française : l’UTF-8 permet de traiter des caractères Unicode, mais ne fournit pas à lui seul les conventions régionales françaises. fr_FR.UTF-8 désigne une locale française utilisant UTF-8 (page Debian sur les locales).

Point à comparer C.UTF-8 fr_FR.UTF-8
Disponibilité par défaut dans l’image officielle Debian Présente par défaut À générer si elle n’est pas déjà disponible (image Debian)
Comportement régional Comportement de la locale C, avec prise en charge UTF-8 Conventions françaises avec prise en charge UTF-8 (documentation Debian)

Diagnostiquer la locale dans le conteneur

Effectuez les vérifications dans le conteneur qui exécute l’application. Un résultat obtenu dans un shell interactif ne prouve pas que le processus PHP reçoit les mêmes variables ni suit le même chemin de lancement.

  1. Identifiez la base de l’image. La méthode décrite ici pour générer une locale concerne Debian ; ne l’appliquez pas automatiquement à Alpine ou à une autre base. Vérifiez le système réellement utilisé plutôt que de déduire la distribution du seul Dockerfile.
  2. Vérifiez les locales installées. Dans un conteneur Debian, exécutez locale -a. Si fr_FR.UTF-8 n’apparaît pas, inspectez /etc/locale.gen et vérifiez que la locale voulue y est sélectionnée, puis lancez locale-gen. Cette commande compile les locales sélectionnées ; relancez locale -a pour constater les noms disponibles, qui peuvent être normalisés par le système (documentation Debian de locale-gen).
  3. Contrôlez l’environnement reçu par PHP. Vérifiez LANG, LC_ALL et les variables LC_* dans le contexte de lancement de l’application. La configuration d’un service ou du processus de lancement peut différer de l’environnement observé dans le shell. Même si LANG=fr_FR.UTF-8 est présent, cela ne prouve pas que PHP a appliqué cette locale.
  4. Initialisez la locale depuis PHP et contrôlez le retour. Pour demander à PHP de prendre ses réglages dans l’environnement, appelez setlocale(LC_ALL, ''), ou ciblez la catégorie dont votre application a besoin. La fonction renvoie la locale définie ou false si la locale demandée n’existe pas ou n’est pas prise en charge (manuel PHP).
  5. Lisez l’état de la catégorie pertinente. Un appel sur LC_ALL peut produire un état composite. Consultez aussi la catégorie concernée afin de repérer un LC_CTYPE qui serait resté en C.UTF-8, par exemple.
  6. Reproduisez le problème par le même chemin d’exécution. Testez dans le même conteneur, avec le même SAPI, les mêmes variables de service et le même lancement que l’application concernée. Les résultats d’un autre contexte ne suffisent pas à attribuer la cause à une version de PHP ou à un orchestrateur.

Choisir la catégorie PHP adaptée

setlocale() agit sur des catégories distinctes. Modifier l’une d’elles ne change pas automatiquement les autres (manuel PHP).

  • LC_CTYPE concerne notamment la classification et la conversion des caractères.
  • LC_TIME contrôle les conventions de formatage des dates.
  • LC_NUMERIC concerne notamment le séparateur décimal.
  • LC_ALL demande une configuration générale ; ciblez plutôt une catégorie précise si votre besoin est limité à un aspect.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Ce qui est établi sur le cas rapporté

Le cas décrit rapporte que LC_CTYPE du processus PHP restait en C.UTF-8 malgré une configuration française dans le Dockerfile, et attribue le problème à l’absence d’initialisation explicite de la locale du processus. Le Dockerfile, la version de PHP, l’image de base et le SAPI de cet incident ne sont pas précisés ; cette explication décrit le cas rapporté, sans établir le déclencheur exact d’un autre déploiement (manuel PHP).

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Docker Container Linux Devops Programming Coding T-Shirt
  • Docker, Docker Swarm, Docker Compose, Programmer, Developer, Coding, Programming, Software Engineer, Code, DevOps, Deploy, Deployment, Kubernetes, Salt, Puppet, Chef, Terraform, Container, AWS, Azure, Cloud, Geek, Funny, Computer, Software, Tech, IT
  • Integration, Scrum, Compile, Compilation, Science, Bug, Debug, Python, Linux, Java, Javascript, Scala, Dotnet, Kotlin
  • Lightweight, Classic fit, Double-needle sleeve and bottom hem

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.