[{"data":1,"prerenderedAt":1781},["ShallowReactive",2],{"navigation":3,"/docs/getting-started/contributing":229,"/docs/getting-started/contributing-surround":1776},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","/docs","docs",[9,12,56,85,132,153,186,203,216],{"title":10,"path":6,"stem":11},"","docs/index",{"title":13,"path":14,"stem":15,"children":16,"icon":55},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[17,19,23,27,31,35,39,43,47,51],{"title":18,"path":14,"stem":15},"Introduction",{"title":20,"path":21,"stem":22},"Container Basics","/docs/getting-started/container-basics","docs/1.getting-started/2.container-basics",{"title":24,"path":25,"stem":26},"Installation","/docs/getting-started/installation","docs/1.getting-started/3.installation",{"title":28,"path":29,"stem":30},"These Images vs Others","/docs/getting-started/these-images-vs-others","docs/1.getting-started/4.these-images-vs-others",{"title":32,"path":33,"stem":34},"Choosing an Image","/docs/getting-started/choosing-an-image","docs/1.getting-started/5.choosing-an-image",{"title":36,"path":37,"stem":38},"Default Configurations","/docs/getting-started/default-configurations","docs/1.getting-started/6.default-configurations",{"title":40,"path":41,"stem":42},"Upgrade Guide","/docs/getting-started/upgrade-guide","docs/1.getting-started/7.upgrade-guide",{"title":44,"path":45,"stem":46},"Changelog","/docs/getting-started/changelog","docs/1.getting-started/8.changelog",{"title":48,"path":49,"stem":50},"About","/docs/getting-started/about","docs/1.getting-started/9.about",{"title":52,"path":53,"stem":54},"Contributing","/docs/getting-started/contributing","docs/1.getting-started/99.contributing",false,{"title":57,"path":58,"stem":59,"children":60,"page":55},"Image Variations","/docs/image-variations","docs/2.image-variations",[61,65,69,73,77,81],{"title":62,"path":63,"stem":64},"CLI","/docs/image-variations/cli","docs/2.image-variations/cli",{"title":66,"path":67,"stem":68},"FPM","/docs/image-variations/fpm","docs/2.image-variations/fpm",{"title":70,"path":71,"stem":72},"FPM-Apache","/docs/image-variations/fpm-apache","docs/2.image-variations/fpm-apache",{"title":74,"path":75,"stem":76},"FPM-NGINX","/docs/image-variations/fpm-nginx","docs/2.image-variations/fpm-nginx",{"title":78,"path":79,"stem":80},"FrankenPHP","/docs/image-variations/frankenphp","docs/2.image-variations/frankenphp",{"title":82,"path":83,"stem":84},"Unit (Deprecated)","/docs/image-variations/unit","docs/2.image-variations/unit",{"title":86,"path":87,"stem":88,"children":89,"page":55},"Framework Guides","/docs/framework-guides","docs/3.framework-guides",[90,123],{"title":91,"icon":55,"defaultOpen":55,"path":92,"stem":93,"children":94,"page":55},"Laravel","/docs/framework-guides/laravel","docs/3.framework-guides/1.laravel",[95,99,103,107,111,115,119],{"title":96,"path":97,"stem":98},"Automations","/docs/framework-guides/laravel/automations","docs/3.framework-guides/1.laravel/1.automations",{"title":100,"path":101,"stem":102},"Task Scheduler","/docs/framework-guides/laravel/task-scheduler","docs/3.framework-guides/1.laravel/2.task-scheduler",{"title":104,"path":105,"stem":106},"Queue","/docs/framework-guides/laravel/queue","docs/3.framework-guides/1.laravel/3.queue",{"title":108,"path":109,"stem":110},"Horizon","/docs/framework-guides/laravel/horizon","docs/3.framework-guides/1.laravel/4.horizon",{"title":112,"path":113,"stem":114},"Reverb","/docs/framework-guides/laravel/reverb","docs/3.framework-guides/1.laravel/4.reverb",{"title":116,"path":117,"stem":118},"Nightwatch","/docs/framework-guides/laravel/nightwatch","docs/3.framework-guides/1.laravel/5.nightwatch",{"title":120,"path":121,"stem":122},"Octane","/docs/framework-guides/laravel/octane","docs/3.framework-guides/1.laravel/octane",{"title":124,"icon":55,"defaultOpen":55,"path":125,"stem":126,"children":127,"page":55},"WordPress","/docs/framework-guides/wordpress","docs/3.framework-guides/2.wordpress",[128],{"title":129,"path":130,"stem":131},"Using Docker with WordPress","/docs/framework-guides/wordpress/using-wordpress-with-docker","docs/3.framework-guides/2.wordpress/4.using-wordpress-with-docker",{"title":133,"path":134,"stem":135,"children":136,"page":55},"Deployment And Production","/docs/deployment-and-production","docs/4.deployment-and-production",[137,141,145,149],{"title":138,"path":139,"stem":140},"Development to Production","/docs/deployment-and-production/development-to-production","docs/4.deployment-and-production/2.development-to-production",{"title":142,"path":143,"stem":144},"Packaging Your App for Deployment","/docs/deployment-and-production/packaging-your-app-for-deployment","docs/4.deployment-and-production/3.packaging-your-app-for-deployment",{"title":146,"path":147,"stem":148},"Configuring SSL","/docs/deployment-and-production/configuring-ssl","docs/4.deployment-and-production/4.configuring-ssl",{"title":150,"path":151,"stem":152},"Choosing a Host","/docs/deployment-and-production/choosing-a-host","docs/4.deployment-and-production/5.choosing-a-host",{"title":154,"icon":55,"defaultOpen":55,"path":155,"stem":156,"children":157,"page":55},"Advanced Guides","/docs/guide","docs/5.guide",[158,162,166,170,174,178,182],{"title":159,"path":160,"stem":161},"Migrating from official PHP images","/docs/guide/migrating-from-official-php-images","docs/5.guide/1.migrating-from-official-php-images",{"title":163,"path":164,"stem":165},"Using Healthchecks With Laravel","/docs/guide/using-healthchecks-with-laravel","docs/5.guide/2.using-healthchecks-with-laravel",{"title":167,"path":168,"stem":169},"Using S6 Overlay","/docs/guide/using-s6-overlay","docs/5.guide/2.using-s6-overlay",{"title":171,"path":172,"stem":173},"Understanding File Permissions","/docs/guide/understanding-file-permissions","docs/5.guide/3.understanding-file-permissions",{"title":175,"path":176,"stem":177},"Configuring Trusted Proxies","/docs/guide/configuring-trusted-proxies","docs/5.guide/4.configuring-trusted-proxies",{"title":179,"path":180,"stem":181},"Major version migrations","/docs/guide/major-version-migrations","docs/5.guide/5.major-version-migrations",{"title":183,"path":184,"stem":185},"Production performance tuning","/docs/guide/production-performance-tuning","docs/5.guide/6.production-performance-tuning",{"title":187,"icon":55,"defaultOpen":55,"path":188,"stem":189,"children":190,"page":55},"Customization","/docs/customizing-the-image","docs/6.customizing-the-image",[191,195,199],{"title":192,"path":193,"stem":194},"Changing php.ini settings","/docs/customizing-the-image/changing-common-php-settings","docs/6.customizing-the-image/1.changing-common-php-settings",{"title":196,"path":197,"stem":198},"Installing PHP extensions","/docs/customizing-the-image/installing-additional-php-extensions","docs/6.customizing-the-image/2.installing-additional-php-extensions",{"title":200,"path":201,"stem":202},"Adding Start Up Scripts","/docs/customizing-the-image/adding-your-own-start-up-scripts","docs/6.customizing-the-image/3.adding-your-own-start-up-scripts",{"title":204,"path":205,"stem":206,"children":207,"page":55},"Troubleshooting","/docs/troubleshooting","docs/7.troubleshooting",[208,212],{"title":209,"path":210,"stem":211},"Common Issues","/docs/troubleshooting/common-issues","docs/7.troubleshooting/1.common-issues",{"title":213,"path":214,"stem":215},"Getting Help","/docs/troubleshooting/getting-help","docs/7.troubleshooting/2.getting-help",{"title":217,"path":218,"stem":219,"children":220,"page":55},"Reference","/docs/reference","docs/8.reference",[221,225],{"title":222,"path":223,"stem":224},"Environment Variable Specification","/docs/reference/environment-variable-specification","docs/8.reference/1.environment-variable-specification",{"title":226,"path":227,"stem":228},"Command Reference","/docs/reference/command-reference","docs/8.reference/2.command-reference",{"id":230,"title":52,"body":231,"description":1769,"extension":273,"links":1770,"meta":1771,"navigation":1126,"path":53,"redirect":1770,"seo":1774,"stem":54,"__hash__":1775},"docs/docs/1.getting-started/99.contributing.md",{"type":232,"value":233,"toc":1750},"minimark",[234,241,246,249,260,278,282,285,298,302,315,319,326,331,371,378,393,421,426,429,824,828,831,877,881,888,909,915,922,925,934,951,977,984,1000,1024,1035,1038,1042,1045,1052,1056,1085,1269,1284,1294,1298,1326,1375,1379,1393,1404,1418,1450,1453,1457,1464,1468,1498,1502,1623,1627,1662,1670,1673,1684,1687,1691,1694,1746],[235,236,237],"lead-p",{},[238,239,240],"p",{},"Thanks for your interest in contributing to this project! Please use read this entire guide before submitting a pull request.",[242,243,245],"h2",{"id":244},"improve-the-docs","Improve the docs",[238,247,248],{},"Improving the docs is very easy. If you find a simple mistake, look at the bottom of the Table Of Contents section and click \"Edit this page\".",[238,250,251,252,255,256,259],{},"If you'd like to contribute bigger documentation changes, take a look at the ",[253,254,6],"code",{}," directory. Our entire site is available in that directory and you can see the process to easily install this on your machine by reading ",[253,257,258],{},"/docs/README.md",".",[261,262],"u-button",{"ariaLabel":263,"className":264,"color":272,"label":263,"size":273,"target":274,"to":275,"trailing-icon":276,"variant":277},"Learn how to contribute to the docs",[265,266,267,268,269,270,271],"font-bold","ring","ring-inset","ring-blue-600","text-blue-600","hover:ring-blue-500","hover:text-blue-500","primary","md","_blank","https://github.com/serversideup/docker-php/tree/main/docs","i-lucide-arrow-right","outline",[242,279,281],{"id":280},"project-dependencies","Project dependencies",[238,283,284],{},"You must have these installed on your system.",[286,287,288],"ul",{},[289,290,291,292],"li",{},"Docker (container engine): ",[293,294,295],"a",{"href":295,"rel":296},"https://www.docker.com/products/docker-desktop",[297],"nofollow",[242,299,301],{"id":300},"how-things-work","How things work",[303,304,305,312],"ol",{},[289,306,307,308,311],{},"All files are stored in the ",[253,309,310],{},"/src"," folder",[289,313,314],{},"GitHub Actions will automatically build and deploy the images",[242,316,318],{"id":317},"running-things-locally","Running things locally",[238,320,321,322,325],{},"To run a build, simply run ",[253,323,324],{},"./scripts/dev.sh"," (with Docker Desktop running). This will show you a help menu with all the available options.",[327,328,330],"h4",{"id":329},"example-build-a-fpm-nginx-image-running-php-8212-on-debian-bookworm","Example: Build a FPM-NGINX image running PHP 8.2.12 on Debian Bookworm",[332,333,338],"pre",{"className":334,"code":335,"filename":336,"language":337,"meta":10,"style":10},"language-bash shiki shiki-themes github-dark","bash scripts/dev.sh --variation fpm-nginx --version 8.2.12 --os bookworm\n","Terminal","bash",[253,339,340],{"__ignoreMap":10},[341,342,345,348,352,356,359,362,365,368],"span",{"class":343,"line":344},"line",1,[341,346,337],{"class":347},"svObZ",[341,349,351],{"class":350},"sU2Wk"," scripts/dev.sh",[341,353,355],{"class":354},"sDLfK"," --variation",[341,357,358],{"class":350}," fpm-nginx",[341,360,361],{"class":354}," --version",[341,363,364],{"class":354}," 8.2.12",[341,366,367],{"class":354}," --os",[341,369,370],{"class":350}," bookworm\n",[238,372,373,374,377],{},"This will build ",[253,375,376],{},"serversideup/php:8.2.12-fpm-nginx-bookworm"," locally on your machine for testing and inspection.",[238,379,380,381,385,386,389,390,259],{},"By default, local builds start from the official PHP image on Docker Hub, which is fast. CI compiles PHP from source instead (see ",[293,382,384],{"href":383},"#how-php-is-built","How PHP is built","). To build exactly what CI builds, add ",[253,387,388],{},"--build-php-base"," with a full patch version. Compiling PHP takes several minutes. The compiled base only exists in your local image store. It needs Docker's default builder and can't be combined with ",[253,391,392],{},"--push",[332,394,396],{"className":334,"code":395,"filename":336,"language":337,"meta":10,"style":10},"bash scripts/dev.sh --variation fpm-nginx --version 8.4.27 --os bookworm --build-php-base\n",[253,397,398],{"__ignoreMap":10},[341,399,400,402,404,406,408,410,413,415,418],{"class":343,"line":344},[341,401,337],{"class":347},[341,403,351],{"class":350},[341,405,355],{"class":354},[341,407,358],{"class":350},[341,409,361],{"class":354},[341,411,412],{"class":354}," 8.4.27",[341,414,367],{"class":354},[341,416,417],{"class":350}," bookworm",[341,419,420],{"class":354}," --build-php-base\n",[422,423,425],"h3",{"id":424},"published-beta-images","Published Beta Images",[238,427,428],{},"We also have beta images that are published to our Docker Hub and GitHub Packages repositories.",[430,431,432,445],"table",{},[433,434,435],"thead",{},[436,437,438,442],"tr",{},[439,440,441],"th",{},"⚙️ Variation",[439,443,444],{},"🚀 Version",[446,447,448,542,627,672,757],"tbody",{},[436,449,450,454],{},[451,452,453],"td",{},"cli",[451,455,456,460,461,460,473,460,482,460,491,500,503,460,506,460,515,460,524,460,533],{},[457,458,459],"strong",{},"Debian Based"," ",[293,462,465],{"href":463,"rel":464},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-cli&page=1&ordering=-name",[297],[466,467],"img",{"alt":468,"className":469,"src":472},"serversideup/php:beta-8.5-cli",[470,471],"h-5","w-auto","https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-cli?label=serversideup%2Fphp%3Abeta-8.5-cli",[293,474,477],{"href":475,"rel":476},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-cli&page=1&ordering=-name",[297],[466,478],{"alt":479,"className":480,"src":481},"serversideup/php:beta-8.4-cli",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-cli?label=serversideup%2Fphp%3Abeta-8.4-cli",[293,483,486],{"href":484,"rel":485},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-cli&page=1&ordering=-name",[297],[466,487],{"alt":488,"className":489,"src":490},"serversideup/php:beta-8.3-cli",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-cli?label=serversideup%2Fphp%3Abeta-8.3-cli",[293,492,495],{"href":493,"rel":494},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.2-cli&page=1&ordering=-name",[297],[466,496],{"alt":497,"className":498,"src":499},"serversideup/php:beta-8.2-cli",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.2-cli?label=serversideup%2Fphp%3Abeta-8.2-cli",[501,502],"br",{},[457,504,505],{},"Alpine Based",[293,507,510],{"href":508,"rel":509},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-cli-alpine&page=1&ordering=-name",[297],[466,511],{"alt":512,"className":513,"src":514},"serversideup/php:beta-8.5-cli-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-cli-alpine?label=serversideup%2Fphp%3Abeta-8.5-cli-alpine",[293,516,519],{"href":517,"rel":518},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-cli-alpine&page=1&ordering=-name",[297],[466,520],{"alt":521,"className":522,"src":523},"serversideup/php:beta-8.4-cli-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-cli-alpine?label=serversideup%2Fphp%3Abeta-8.4-cli-alpine",[293,525,528],{"href":526,"rel":527},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-cli-alpine&page=1&ordering=-name",[297],[466,529],{"alt":530,"className":531,"src":532},"serversideup/php:beta-8.3-cli-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-cli-alpine?label=serversideup%2Fphp%3Abeta-8.3-cli-alpine",[293,534,537],{"href":535,"rel":536},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.2-cli-alpine&page=1&ordering=-name",[297],[466,538],{"alt":539,"className":540,"src":541},"serversideup/php:beta-8.2-cli-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.2-cli-alpine?label=serversideup%2Fphp%3Abeta-8.2-cli-alpine",[436,543,544,547],{},[451,545,546],{},"fpm",[451,548,549,460,551,460,560,460,569,460,578,587,589,460,591,460,600,460,609,460,618],{},[457,550,459],{},[293,552,555],{"href":553,"rel":554},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-fpm&page=1&ordering=-name",[297],[466,556],{"alt":557,"className":558,"src":559},"serversideup/php:beta-8.5-fpm",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-fpm?label=serversideup%2Fphp%3Abeta-8.5-fpm",[293,561,564],{"href":562,"rel":563},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-fpm&page=1&ordering=-name",[297],[466,565],{"alt":566,"className":567,"src":568},"serversideup/php:beta-8.4-fpm",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-fpm?label=serversideup%2Fphp%3Abeta-8.4-fpm",[293,570,573],{"href":571,"rel":572},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-fpm&page=1&ordering=-name",[297],[466,574],{"alt":575,"className":576,"src":577},"serversideup/php:beta-8.3-fpm",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-fpm?label=serversideup%2Fphp%3Abeta-8.3-fpm",[293,579,582],{"href":580,"rel":581},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.2-fpm&page=1&ordering=-name",[297],[466,583],{"alt":584,"className":585,"src":586},"serversideup/php:beta-8.2-fpm",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.2-fpm?label=serversideup%2Fphp%3Abeta-8.2-fpm",[501,588],{},[457,590,505],{},[293,592,595],{"href":593,"rel":594},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-fpm-alpine&page=1&ordering=-name",[297],[466,596],{"alt":597,"className":598,"src":599},"serversideup/php:beta-8.5-fpm-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-fpm-alpine?label=serversideup%2Fphp%3Abeta-8.5-fpm-alpine",[293,601,604],{"href":602,"rel":603},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-fpm-alpine&page=1&ordering=-name",[297],[466,605],{"alt":606,"className":607,"src":608},"serversideup/php:beta-8.4-fpm-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-fpm-alpine?label=serversideup%2Fphp%3Abeta-8.4-fpm-alpine",[293,610,613],{"href":611,"rel":612},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-fpm-alpine&page=1&ordering=-name",[297],[466,614],{"alt":615,"className":616,"src":617},"serversideup/php:beta-8.3-fpm-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-fpm-alpine?label=serversideup%2Fphp%3Abeta-8.3-fpm-alpine",[293,619,622],{"href":620,"rel":621},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.2-fpm-alpine&page=1&ordering=-name",[297],[466,623],{"alt":624,"className":625,"src":626},"serversideup/php:beta-8.2-fpm-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.2-fpm-alpine?label=serversideup%2Fphp%3Abeta-8.2-fpm-alpine",[436,628,629,632],{},[451,630,631],{},"fpm-apache",[451,633,634,460,636,460,645,460,654,460,663],{},[457,635,459],{},[293,637,640],{"href":638,"rel":639},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-fpm-apache&page=1&ordering=-name",[297],[466,641],{"alt":642,"className":643,"src":644},"serversideup/php:beta-8.5-fpm-apache",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-fpm-apache?label=serversideup%2Fphp%3Abeta-8.5-fpm-apache",[293,646,649],{"href":647,"rel":648},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-fpm-apache&page=1&ordering=-name",[297],[466,650],{"alt":651,"className":652,"src":653},"serversideup/php:beta-8.4-fpm-apache",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-fpm-apache?label=serversideup%2Fphp%3Abeta-8.4-fpm-apache",[293,655,658],{"href":656,"rel":657},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-fpm-apache&page=1&ordering=-name",[297],[466,659],{"alt":660,"className":661,"src":662},"serversideup/php:beta-8.3-fpm-apache",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-fpm-apache?label=serversideup%2Fphp%3Abeta-8.3-fpm-apache",[293,664,667],{"href":665,"rel":666},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.2-fpm-apache&page=1&ordering=-name",[297],[466,668],{"alt":669,"className":670,"src":671},"serversideup/php:beta-8.2-fpm-apache",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.2-fpm-apache?label=serversideup%2Fphp%3Abeta-8.2-fpm-apache",[436,673,674,677],{},[451,675,676],{},"fpm-nginx",[451,678,679,460,681,460,690,460,699,460,708,717,719,460,721,460,730,460,739,460,748],{},[457,680,459],{},[293,682,685],{"href":683,"rel":684},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-fpm-nginx&page=1&ordering=-name",[297],[466,686],{"alt":687,"className":688,"src":689},"serversideup/php:beta-8.5-fpm-nginx",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-fpm-nginx?label=serversideup%2Fphp%3Abeta-8.5-fpm-nginx",[293,691,694],{"href":692,"rel":693},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-fpm-nginx&page=1&ordering=-name",[297],[466,695],{"alt":696,"className":697,"src":698},"serversideup/php:beta-8.4-fpm-nginx",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-fpm-nginx?label=serversideup%2Fphp%3Abeta-8.4-fpm-nginx",[293,700,703],{"href":701,"rel":702},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-fpm-nginx&page=1&ordering=-name",[297],[466,704],{"alt":705,"className":706,"src":707},"serversideup/php:beta-8.3-fpm-nginx",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-fpm-nginx?label=serversideup%2Fphp%3Abeta-8.3-fpm-nginx",[293,709,712],{"href":710,"rel":711},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.2-fpm-nginx&page=1&ordering=-name",[297],[466,713],{"alt":714,"className":715,"src":716},"serversideup/php:beta-8.2-fpm-nginx",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.2-fpm-nginx?label=serversideup%2Fphp%3Abeta-8.2-fpm-nginx",[501,718],{},[457,720,505],{},[293,722,725],{"href":723,"rel":724},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-fpm-nginx-alpine&page=1&ordering=-name",[297],[466,726],{"alt":727,"className":728,"src":729},"serversideup/php:beta-8.5-fpm-nginx-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-fpm-nginx-alpine?label=serversideup%2Fphp%3Abeta-8.5-fpm-nginx-alpine",[293,731,734],{"href":732,"rel":733},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-fpm-nginx-alpine&page=1&ordering=-name",[297],[466,735],{"alt":736,"className":737,"src":738},"serversideup/php:beta-8.4-fpm-nginx-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-fpm-nginx-alpine?label=serversideup%2Fphp%3Abeta-8.4-fpm-nginx-alpine",[293,740,743],{"href":741,"rel":742},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-fpm-nginx-alpine&page=1&ordering=-name",[297],[466,744],{"alt":745,"className":746,"src":747},"serversideup/php:beta-8.3-fpm-nginx-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-fpm-nginx-alpine?label=serversideup%2Fphp%3Abeta-8.3-fpm-nginx-alpine",[293,749,752],{"href":750,"rel":751},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.2-fpm-nginx-alpine&page=1&ordering=-name",[297],[466,753],{"alt":754,"className":755,"src":756},"serversideup/php:beta-8.2-fpm-nginx-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.2-fpm-nginx-alpine?label=serversideup%2Fphp%3Abeta-8.2-fpm-nginx-alpine",[436,758,759,762],{},[451,760,761],{},"frankenphp",[451,763,764,460,766,460,775,460,784,460,793,795,460,797,460,806,460,815],{},[457,765,459],{},[293,767,770],{"href":768,"rel":769},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-frankenphp&page=1&ordering=-name",[297],[466,771],{"alt":772,"className":773,"src":774},"serversideup/php:beta-8.5-frankenphp",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-frankenphp?label=serversideup%2Fphp%3Abeta-8.5-frankenphp",[293,776,779],{"href":777,"rel":778},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-frankenphp&page=1&ordering=-name",[297],[466,780],{"alt":781,"className":782,"src":783},"serversideup/php:beta-8.4-frankenphp",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-frankenphp?label=serversideup%2Fphp%3Abeta-8.4-frankenphp",[293,785,788],{"href":786,"rel":787},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-frankenphp&page=1&ordering=-name",[297],[466,789],{"alt":790,"className":791,"src":792},"serversideup/php:beta-8.3-frankenphp",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-frankenphp?label=serversideup%2Fphp%3Abeta-8.3-frankenphp",[501,794],{},[457,796,505],{},[293,798,801],{"href":799,"rel":800},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.5-frankenphp-alpine&page=1&ordering=-name",[297],[466,802],{"alt":803,"className":804,"src":805},"serversideup/php:beta-8.5-frankenphp-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.5-frankenphp-alpine?label=serversideup%2Fphp%3Abeta-8.5-frankenphp-alpine",[293,807,810],{"href":808,"rel":809},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.4-frankenphp-alpine&page=1&ordering=-name",[297],[466,811],{"alt":812,"className":813,"src":814},"serversideup/php:beta-8.4-frankenphp-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.4-frankenphp-alpine?label=serversideup%2Fphp%3Abeta-8.4-frankenphp-alpine",[293,816,819],{"href":817,"rel":818},"https://hub.docker.com/r/serversideup/php/tags?name=beta-8.3-frankenphp-alpine&page=1&ordering=-name",[297],[466,820],{"alt":821,"className":822,"src":823},"serversideup/php:beta-8.3-frankenphp-alpine",[470,471],"https://img.shields.io/docker/image-size/serversideup/php/beta-8.3-frankenphp-alpine?label=serversideup%2Fphp%3Abeta-8.3-frankenphp-alpine",[327,825,827],{"id":826},"running-a-test-web-server","Running a test web server:",[238,829,830],{},"Sometimes you need to just run a test web server locally to see if your changes work. Below is a good example on how to quickly do this.",[332,832,834],{"className":334,"code":833,"filename":336,"language":337,"meta":10,"style":10},"docker run --rm -v $(pwd):/var/www/html -p 80:8080 -p 443:8443 serversideup/php:8.4-fpm-nginx\n",[253,835,836],{"__ignoreMap":10},[341,837,838,841,844,847,850,854,857,860,863,866,869,871,874],{"class":343,"line":344},[341,839,840],{"class":347},"docker",[341,842,843],{"class":350}," run",[341,845,846],{"class":354}," --rm",[341,848,849],{"class":354}," -v",[341,851,853],{"class":852},"s95oV"," $(",[341,855,856],{"class":354},"pwd",[341,858,859],{"class":852},")",[341,861,862],{"class":350},":/var/www/html",[341,864,865],{"class":354}," -p",[341,867,868],{"class":350}," 80:8080",[341,870,865],{"class":354},[341,872,873],{"class":350}," 443:8443",[341,875,876],{"class":350}," serversideup/php:8.4-fpm-nginx\n",[242,878,880],{"id":879},"how-php-versions-are-selected-for-distribution","How PHP versions are selected for distribution",[238,882,883,884,887],{},"The file ",[253,885,886],{},"scripts/conf/php-versions-base-config.yml"," selects which PHP versions are built and the rules for each one, like base OS and default versions.",[238,889,890,891,894,895,900,901,904,905,908],{},"The ",[253,892,893],{},"scripts/get-php-versions.sh"," script downloads the ",[293,896,899],{"href":897,"rel":898},"https://www.php.net/releases/active.php",[297],"latest active releases from PHP"," and merges them into a final file called ",[253,902,903],{},"scripts/conf/php-versions.yml",". To pin a minor version to a specific patch (or hold back a bad release), list it under that minor's ",[253,906,907],{},"patch_versions"," in the base config. A pinned patch replaces the one from php.net.",[238,910,890,911,914],{},[253,912,913],{},"php-versions.yml"," file will include all final versions for tagging and building.",[238,916,917,918,921],{},"We generate our tags with a file called ",[253,919,920],{},"scripts/assemble-docker-tags.sh"," which handles all the advanced logic of compiling our tags together.",[242,923,384],{"id":924},"how-php-is-built",[238,926,927,928,933],{},"We compile PHP from the php.net tarball with the same Dockerfiles that build the ",[293,929,932],{"href":930,"rel":931},"https://github.com/docker-library/php",[297],"official PHP images",". A security release can ship as soon as php.net publishes it, without waiting for the official images on Docker Hub. No step of the build depends on PECL.",[238,935,936,937,939,940,942,943,946,947,950],{},"For every PHP version, base OS, and upstream variant (",[253,938,453],{},", ",[253,941,546],{},", or ",[253,944,945],{},"zts","), ",[253,948,949],{},"scripts/prepare-php-base.sh"," downloads docker-library/php at a pinned commit and changes only three things in its Dockerfile:",[286,952,953,956,962],{},[289,954,955],{},"The PHP version, download URL, and SHA256 are set to the patch we're building. The SHA256 comes from php.net, and the GPG signature check stays exactly as upstream runs it.",[289,957,890,958,961],{},[253,959,960],{},"pecl update-channels"," call is removed, so a PECL outage can't fail the build.",[289,963,964,967,968,971,972,976],{},[253,965,966],{},"PHP_BUILD_PROVIDER"," names us, so ",[253,969,970],{},"php -v"," shows \"Built by Server Side Up (",[293,973,974],{"href":974,"rel":975},"https://serversideup.net/php",[297],")\". We compile and ship these binaries, so PHP questions should come to us rather than docker-library.",[238,978,979,980,983],{},"The build phase compiles each base once and saves it to a private registry, then every variation is built on top of it. Bases are always compiled without the build cache. That way every run picks up the latest Debian and Alpine packages PHP links against, like curl, Brotli, and OpenSSL, without waiting for a new official image. The ",[253,981,982],{},"redis"," extension is built from its GitHub source for the same reason.",[238,985,986,987,990,991,996,997,999],{},"Release candidates work the same way. A version like ",[253,988,989],{},"8.6-rc"," in the base config builds the newest release candidate on php.net's ",[293,992,995],{"href":993,"rel":994},"https://www.php.net/release-candidates.php?format=json",[297],"release candidates feed",", from docker-library's ",[253,998,989],{}," directory, so testers get each RC as soon as php.net publishes it.",[238,1001,1002,1003,1006,1007,939,1009,942,1011,1013,1014,1017,1018,1020,1021,259],{},"Each variation names the docker-library variant it builds on with ",[253,1004,1005],{},"php_base"," (",[253,1008,453],{},[253,1010,546],{},[253,1012,945],{},"). When upstream changes its variants for a new PHP version, set ",[253,1015,1016],{},"php_base_overrides"," on that minor version. For example, docker-library builds every 8.6 image with ZTS and has no separate ",[253,1019,945],{}," variant, so 8.6 sets ",[253,1022,1023],{},"frankenphp: cli",[238,1025,1026,1027,1030,1031,1034],{},"PHP 8.1 is no longer on docker-library's ",[253,1028,1029],{},"master"," branch. Its entry in the base config sets ",[253,1032,1033],{},"docker_library_ref"," to the last commit that had it. Do the same for any other version docker-library drops.",[238,1036,1037],{},"All the scripts above are designed to run locally and in GitHub Actions. Feel free to execute these scripts to see the help menus and how they work.",[242,1039,1041],{"id":1040},"github-actions","GitHub Actions",[238,1043,1044],{},"We use GitHub Actions exclusively to publish all of our releases. If the image exists from DockerHub or GitHub Packages, it will never be published from a local machine.",[238,1046,1047,1048,1051],{},"See ",[253,1049,1050],{},".github/workflows/action_publish-images-beta.yml"," for an example of how we publish our beta images.",[422,1053,1055],{"id":1054},"linting","Linting",[238,1057,1058,1059,1062,1063,1068,1069,1074,1075,1080,1081,1084],{},"Every pull request starts with a ",[253,1060,1061],{},"lint"," group that runs before any image is built: ",[293,1064,1067],{"href":1065,"rel":1066},"https://github.com/rhysd/actionlint",[297],"actionlint"," for the workflows, ",[293,1070,1073],{"href":1071,"rel":1072},"https://www.shellcheck.net/",[297],"ShellCheck"," for the scripts, and ",[293,1076,1079],{"href":1077,"rel":1078},"https://github.com/hadolint/hadolint",[297],"hadolint"," for the Dockerfiles, plus fixture tests for the helper scripts in ",[253,1082,1083],{},"scripts/"," that CI relies on. Run the same checks locally before you push:",[332,1086,1088],{"className":334,"code":1087,"filename":336,"language":337,"meta":10,"style":10},"docker run --rm -v \"$PWD:/repo\" -w /repo rhysd/actionlint:latest -color\n\ndocker run --rm -v \"$PWD:/repo\" -w /repo koalaman/shellcheck:stable --severity=warning \\\n  scripts/*.sh scripts/tests/*.sh src/common/usr/local/bin/* src/s6/usr/local/bin/* .oss-scanner/run-variation $(find src -path '*entrypoint.d*' -name '*.sh')\n\ndocker run --rm -v \"$PWD:/repo\" -w /repo hadolint/hadolint:latest hadolint src/variations/*/Dockerfile .oss-scanner/Dockerfile\n\nbash scripts/tests/run.sh\n",[253,1089,1090,1121,1128,1158,1213,1218,1256,1261],{"__ignoreMap":10},[341,1091,1092,1094,1096,1098,1100,1103,1106,1109,1112,1115,1118],{"class":343,"line":344},[341,1093,840],{"class":347},[341,1095,843],{"class":350},[341,1097,846],{"class":354},[341,1099,849],{"class":354},[341,1101,1102],{"class":350}," \"",[341,1104,1105],{"class":852},"$PWD",[341,1107,1108],{"class":350},":/repo\"",[341,1110,1111],{"class":354}," -w",[341,1113,1114],{"class":350}," /repo",[341,1116,1117],{"class":350}," rhysd/actionlint:latest",[341,1119,1120],{"class":354}," -color\n",[341,1122,1124],{"class":343,"line":1123},2,[341,1125,1127],{"emptyLinePlaceholder":1126},true,"\n",[341,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1152,1155],{"class":343,"line":1130},3,[341,1132,840],{"class":347},[341,1134,843],{"class":350},[341,1136,846],{"class":354},[341,1138,849],{"class":354},[341,1140,1102],{"class":350},[341,1142,1105],{"class":852},[341,1144,1108],{"class":350},[341,1146,1111],{"class":354},[341,1148,1114],{"class":350},[341,1150,1151],{"class":350}," koalaman/shellcheck:stable",[341,1153,1154],{"class":354}," --severity=warning",[341,1156,1157],{"class":354}," \\\n",[341,1159,1161,1164,1167,1170,1173,1175,1177,1180,1182,1185,1187,1190,1192,1195,1198,1201,1204,1207,1210],{"class":343,"line":1160},4,[341,1162,1163],{"class":350},"  scripts/",[341,1165,1166],{"class":354},"*",[341,1168,1169],{"class":350},".sh",[341,1171,1172],{"class":350}," scripts/tests/",[341,1174,1166],{"class":354},[341,1176,1169],{"class":350},[341,1178,1179],{"class":350}," src/common/usr/local/bin/",[341,1181,1166],{"class":354},[341,1183,1184],{"class":350}," src/s6/usr/local/bin/",[341,1186,1166],{"class":354},[341,1188,1189],{"class":350}," .oss-scanner/run-variation",[341,1191,853],{"class":852},[341,1193,1194],{"class":347},"find",[341,1196,1197],{"class":350}," src",[341,1199,1200],{"class":354}," -path",[341,1202,1203],{"class":350}," '*entrypoint.d*'",[341,1205,1206],{"class":354}," -name",[341,1208,1209],{"class":350}," '*.sh'",[341,1211,1212],{"class":852},")\n",[341,1214,1216],{"class":343,"line":1215},5,[341,1217,1127],{"emptyLinePlaceholder":1126},[341,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1242,1245,1248,1250,1253],{"class":343,"line":1220},6,[341,1222,840],{"class":347},[341,1224,843],{"class":350},[341,1226,846],{"class":354},[341,1228,849],{"class":354},[341,1230,1102],{"class":350},[341,1232,1105],{"class":852},[341,1234,1108],{"class":350},[341,1236,1111],{"class":354},[341,1238,1114],{"class":350},[341,1240,1241],{"class":350}," hadolint/hadolint:latest",[341,1243,1244],{"class":350}," hadolint",[341,1246,1247],{"class":350}," src/variations/",[341,1249,1166],{"class":354},[341,1251,1252],{"class":350},"/Dockerfile",[341,1254,1255],{"class":350}," .oss-scanner/Dockerfile\n",[341,1257,1259],{"class":343,"line":1258},7,[341,1260,1127],{"emptyLinePlaceholder":1126},[341,1262,1264,1266],{"class":343,"line":1263},8,[341,1265,337],{"class":347},[341,1267,1268],{"class":350}," scripts/tests/run.sh\n",[238,1270,1271,1272,1275,1276,1279,1280,1283],{},"The script tests live in one file, ",[253,1273,1274],{},"scripts/tests/run.sh",", as plain assertions over a small set of sample images. CI runs the same file on a GitHub runner, whose ",[253,1277,1278],{},"jq"," and ",[253,1281,1282],{},"yq"," versions can differ from your machine, so a green run there is the one that counts.",[238,1285,1286,1287,1290,1291,259],{},"The Depot runner labels we use are listed in ",[253,1288,1289],{},".github/actionlint.yaml"," so actionlint recognizes them. New linters belong in ",[253,1292,1293],{},".github/workflows/service_lint.yml",[422,1295,1297],{"id":1296},"what-happens-when-you-open-a-pull-request","What happens when you open a pull request",[238,1299,1300,1301,939,1304,1306,1307,1279,1310,1313,1314,939,1316,939,1318,939,1320,1322,1323,1325],{},"Every pull request that touches ",[253,1302,1303],{},"src/",[253,1305,1083],{},", or the workflows builds the full image matrix for both ",[253,1308,1309],{},"amd64",[253,1311,1312],{},"arm64",". Jobs are grouped by variation, so you can see at a glance whether ",[253,1315,453],{},[253,1317,546],{},[253,1319,631],{},[253,1321,676],{},", and ",[253,1324,761],{}," all build.",[286,1327,1328,1334,1348,1354,1363,1369],{},[289,1329,1330,1333],{},[457,1331,1332],{},"Pull requests from forks"," are built on isolated builders and never leave them. Each build job also loads its amd64 image and runs the image tests against it, so a green check means your change builds everywhere and passes the tests on amd64. Fork builds can't save the compiled PHP base images, so they start from the official PHP images on Docker Hub instead. In the hours after a new PHP release, before Docker Hub has it, fork builds fail. Changes to how PHP is compiled are only tested when a maintainer runs the build for your PR.",[289,1335,1336,1339,1340,1343,1344,1347],{},[457,1337,1338],{},"Pull requests from this repository"," go through the same three phases as a release: build, test, publish. Images are published to ",[253,1341,1342],{},"serversideup/php-dev"," with your PR number as the tag prefix (for example ",[253,1345,1346],{},"serversideup/php-dev:699-8.4-fpm-nginx-alpine",") only after the image tests pass. A comment on the PR shows the status and the pull commands.",[289,1349,1350,1353],{},[457,1351,1352],{},"Every run ends with a summary table"," listing each image with its compressed size per architecture, so a size regression is visible before merge.",[289,1355,1356,1359,1360,259],{},[457,1357,1358],{},"Nothing is published until it passes the image tests."," Every build is saved to a private registry first. Every image is pulled from there on native amd64 and arm64 runners and checked: it starts, runs unprivileged, has no world-writable files or directories, reports the right PHP version, loads the default extensions, becomes healthy, and serves a PHP file through its web server. Only then is the exact same image promoted to Docker Hub, and the published digest is checked against the tested one, so what you pull is what was tested. If any image fails to build or fails its test, nothing from that run is published. You can run the same check locally with ",[253,1361,1362],{},"bash scripts/test-image.sh serversideup/php-dev:\u003Ctag>",[289,1364,1365,1368],{},[457,1366,1367],{},"Transient failures heal themselves."," If a few jobs fail because a registry or mirror hiccupped, CI re-runs just those jobs once. If a release or weekly rebuild is still red after that, CI opens an issue for the maintainers with the failed jobs and their errors.",[289,1370,1371,1374],{},[457,1372,1373],{},"Maintainers"," can publish a fork's images for testing by running the \"Docker Publish (PR Images)\" workflow manually with the PR number.",[242,1376,1378],{"id":1377},"dependency-versions","Dependency versions",[238,1380,1381,1382,1384,1385,1388,1389,1392],{},"Every version that ships in the image is pinned in ",[253,1383,886],{},". Most live under ",[253,1386,1387],{},"dependencies",", where each key is passed to the Dockerfiles as a build arg of the same name. The NGINX version for each OS lives under ",[253,1390,1391],{},"operating_systems",". PHP itself is the exception: its patch versions come from php.net at build time.",[238,1394,1395,1400,1401,259],{},[293,1396,1399],{"href":1397,"rel":1398},"https://docs.renovatebot.com/",[297],"Renovate"," watches every pin and opens a pull request when a newer version is out. Its Dependency Dashboard issue lists each one with its current and available versions. The rules live in ",[253,1402,1403],{},"renovate.json",[238,1405,1406,1407,1409,1410,1413,1414,1417],{},"To update a dependency by hand, edit its line in the base config. To add a new one, add a line under ",[253,1408,1387],{}," with a ",[253,1411,1412],{},"# renovate:"," comment above it. Then declare an ",[253,1415,1416],{},"ARG"," with the same name in each Dockerfile stage that uses it:",[332,1419,1423],{"className":1420,"code":1421,"filename":886,"language":1422,"meta":10,"style":10},"language-yaml shiki shiki-themes github-dark","dependencies:\n  # renovate: datasource=github-releases depName=just-containers/s6-overlay versioning=loose\n  S6_VERSION: v3.2.3.2\n","yaml",[253,1424,1425,1433,1439],{"__ignoreMap":10},[341,1426,1427,1430],{"class":343,"line":344},[341,1428,1387],{"class":1429},"s4JwU",[341,1431,1432],{"class":852},":\n",[341,1434,1435],{"class":343,"line":1123},[341,1436,1438],{"class":1437},"sAwPA","  # renovate: datasource=github-releases depName=just-containers/s6-overlay versioning=loose\n",[341,1440,1441,1444,1447],{"class":343,"line":1130},[341,1442,1443],{"class":1429},"  S6_VERSION",[341,1445,1446],{"class":852},": ",[341,1448,1449],{"class":350},"v3.2.3.2\n",[238,1451,1452],{},"A merged update reaches the published images with the next release.",[242,1454,1456],{"id":1455},"nginx-versions","NGINX versions",[238,1458,1459,1460,1463],{},"We install NGINX from the official NGINX repos. Renovate checks the package listings on nginx.org for each OS and updates the ",[253,1461,1462],{},"nginx_version"," lines in one pull request.",[422,1465,1467],{"id":1466},"nginx-repository-key-verification","NGINX repository key verification",[286,1469,1470,1484],{},[289,1471,1472,1475,1476,1479,1480,1483],{},[457,1473,1474],{},"Debian (APT)",": We import the official NGINX GPG key from ",[253,1477,1478],{},"https://nginx.org/keys/nginx_signing.key"," and verify it against a pinned fingerprint via the ",[253,1481,1482],{},"SIGNING_FINGERPRINT"," build arg.",[289,1485,1486,1489,1490,1493,1494,1497],{},[457,1487,1488],{},"Alpine (APK)",": APK uses a raw RSA public key (",[253,1491,1492],{},"nginx_signing.rsa.pub","). We verify this key by pinning the SHA‑256 of the DER‑encoded public key via the ",[253,1495,1496],{},"SIGNING_ALPINE_RSA_PUB_SHA256"," build arg. You can provide multiple comma‑separated hashes to support key rotation.",[327,1499,1501],{"id":1500},"compute-the-alpine-key-hash-when-updating","Compute the Alpine key hash when updating:",[332,1503,1505],{"className":334,"code":1504,"filename":336,"language":337,"meta":10,"style":10},"curl -sS https://nginx.org/keys/nginx_signing.rsa.pub -o /tmp/nginx_signing.rsa.pub\n\n# macOS\nopenssl rsa -pubin -in /tmp/nginx_signing.rsa.pub -outform DER 2>/dev/null | shasum -a 256 | awk '{print $1}'\n\n# Linux\nopenssl rsa -pubin -in /tmp/nginx_signing.rsa.pub -outform DER 2>/dev/null | sha256sum | awk '{print $1}'\n",[253,1506,1507,1524,1528,1533,1583,1587,1592],{"__ignoreMap":10},[341,1508,1509,1512,1515,1518,1521],{"class":343,"line":344},[341,1510,1511],{"class":347},"curl",[341,1513,1514],{"class":354}," -sS",[341,1516,1517],{"class":350}," https://nginx.org/keys/nginx_signing.rsa.pub",[341,1519,1520],{"class":354}," -o",[341,1522,1523],{"class":350}," /tmp/nginx_signing.rsa.pub\n",[341,1525,1526],{"class":343,"line":1123},[341,1527,1127],{"emptyLinePlaceholder":1126},[341,1529,1530],{"class":343,"line":1130},[341,1531,1532],{"class":1437},"# macOS\n",[341,1534,1535,1538,1541,1544,1547,1550,1553,1556,1560,1563,1566,1569,1572,1575,1577,1580],{"class":343,"line":1160},[341,1536,1537],{"class":347},"openssl",[341,1539,1540],{"class":350}," rsa",[341,1542,1543],{"class":354}," -pubin",[341,1545,1546],{"class":354}," -in",[341,1548,1549],{"class":350}," /tmp/nginx_signing.rsa.pub",[341,1551,1552],{"class":354}," -outform",[341,1554,1555],{"class":350}," DER",[341,1557,1559],{"class":1558},"snl16"," 2>",[341,1561,1562],{"class":350},"/dev/null",[341,1564,1565],{"class":1558}," |",[341,1567,1568],{"class":347}," shasum",[341,1570,1571],{"class":354}," -a",[341,1573,1574],{"class":354}," 256",[341,1576,1565],{"class":1558},[341,1578,1579],{"class":347}," awk",[341,1581,1582],{"class":350}," '{print $1}'\n",[341,1584,1585],{"class":343,"line":1215},[341,1586,1127],{"emptyLinePlaceholder":1126},[341,1588,1589],{"class":343,"line":1220},[341,1590,1591],{"class":1437},"# Linux\n",[341,1593,1594,1596,1598,1600,1602,1604,1606,1608,1610,1612,1614,1617,1619,1621],{"class":343,"line":1258},[341,1595,1537],{"class":347},[341,1597,1540],{"class":350},[341,1599,1543],{"class":354},[341,1601,1546],{"class":354},[341,1603,1549],{"class":350},[341,1605,1552],{"class":354},[341,1607,1555],{"class":350},[341,1609,1559],{"class":1558},[341,1611,1562],{"class":350},[341,1613,1565],{"class":1558},[341,1615,1616],{"class":347}," sha256sum",[341,1618,1565],{"class":1558},[341,1620,1579],{"class":347},[341,1622,1582],{"class":350},[327,1624,1626],{"id":1625},"build-with-the-new-hash-optionally-include-the-old-hash-during-rotation","Build with the new hash (optionally include the old hash during rotation)",[332,1628,1630],{"className":334,"code":1629,"filename":336,"language":337,"meta":10,"style":10},"docker build \\\n  --build-arg SIGNING_ALPINE_RSA_PUB_SHA256=\"\u003Cnew-hash>,\u003Cold-hash>\" \\\n  -f src/variations/fpm-nginx/Dockerfile .\n",[253,1631,1632,1641,1651],{"__ignoreMap":10},[341,1633,1634,1636,1639],{"class":343,"line":344},[341,1635,840],{"class":347},[341,1637,1638],{"class":350}," build",[341,1640,1157],{"class":354},[341,1642,1643,1646,1649],{"class":343,"line":1123},[341,1644,1645],{"class":354},"  --build-arg",[341,1647,1648],{"class":350}," SIGNING_ALPINE_RSA_PUB_SHA256=\"\u003Cnew-hash>,\u003Cold-hash>\"",[341,1650,1157],{"class":354},[341,1652,1653,1656,1659],{"class":343,"line":1130},[341,1654,1655],{"class":354},"  -f",[341,1657,1658],{"class":350}," src/variations/fpm-nginx/Dockerfile",[341,1660,1661],{"class":350}," .\n",[238,1663,1664,1665,259],{},"Reference: ",[293,1666,1669],{"href":1667,"rel":1668},"https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#prebuilt_alpine",[297],"Installing NGINX Open Source → Alpine packages",[238,1671,1672],{},"Why allow multiple hashes? This is optional, but useful during a short rotation window:",[286,1674,1675,1678,1681],{},[289,1676,1677],{},"Ensure CI builds across branches/runners succeed while the upstream key change propagates.",[289,1679,1680],{},"Avoid flakes from CDN/caching delays where some environments still see the old key.",[289,1682,1683],{},"Let you pre-stage the new value before the official switch, then remove the old afterwards.",[238,1685,1686],{},"If you control all builds centrally and can update quickly, pass a single hash.",[242,1688,1690],{"id":1689},"helping-out","Helping out",[238,1692,1693],{},"If you're really eager to help out, here are a few places to get started:",[286,1695,1696,1709,1717,1725,1728],{},[289,1697,1698,1699,1279,1704],{},"Help answer questions on ",[293,1700,1703],{"href":1701,"rel":1702},"https://github.com/serversideup/docker-php/discussions",[297],"our GitHub Discussions",[293,1705,1708],{"href":1706,"rel":1707},"https://serversideup.net/discord",[297],"our Discord",[289,1710,1711,1712],{},"Chime in on ",[293,1713,1716],{"href":1714,"rel":1715},"https://github.com/serversideup/docker-php/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%99%8F+Help+Wanted%22",[297],"issues labeled \"Help Wanted\"",[289,1718,1719,1724],{},[293,1720,1723],{"href":1721,"rel":1722},"https://github.com/serversideup/docker-php/discussions/66",[297],"Open a feature request"," and tell us how we can improve",[289,1726,1727],{},"Run performance tests and share your results",[289,1729,1730,1731,939,1736,939,1741],{},"Say good things and tag us on X (formerly Twitter): ",[293,1732,1735],{"href":1733,"rel":1734},"https://x.com/serversideup",[297],"@serversideup",[293,1737,1740],{"href":1738,"rel":1739},"https://x.com/danpastori",[297],"@danpastori",[293,1742,1745],{"href":1743,"rel":1744},"https://x.com/jaydrogers",[297],"@jaydrogers",[1747,1748,1749],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}",{"title":10,"searchDepth":1123,"depth":1123,"links":1751},[1752,1753,1754,1755,1758,1759,1760,1764,1765,1768],{"id":244,"depth":1123,"text":245},{"id":280,"depth":1123,"text":281},{"id":300,"depth":1123,"text":301},{"id":317,"depth":1123,"text":318,"children":1756},[1757],{"id":424,"depth":1130,"text":425},{"id":879,"depth":1123,"text":880},{"id":924,"depth":1123,"text":384},{"id":1040,"depth":1123,"text":1041,"children":1761},[1762,1763],{"id":1054,"depth":1130,"text":1055},{"id":1296,"depth":1130,"text":1297},{"id":1377,"depth":1123,"text":1378},{"id":1455,"depth":1123,"text":1456,"children":1766},[1767],{"id":1466,"depth":1130,"text":1467},{"id":1689,"depth":1123,"text":1690},"Learn how you can make a difference and contribute to the Docker PHP project.",null,{"head":1772,"layout":7},{"title":1773},"Contributing - Docker PHP - Server Side Up",{"title":52,"description":1769},"T-fl9pLX0RrLNgUHIJkhROcSPSOl7f7xMGMcqYj5lM0",[1777,1779],{"title":48,"path":49,"stem":50,"description":1778,"children":-1},"Learn more about how this project got started and who inspired it.",{"title":62,"path":63,"stem":64,"description":1780,"children":-1},"Learn how to use the CLI variation of the serversideup/php image.",1793279089499]