[{"data":1,"prerenderedAt":951},["ShallowReactive",2],{"navigation":3,"/docs/getting-started/migrating-from-official-php-images":249,"/docs/getting-started/migrating-from-official-php-images-surround":946},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","/docs","docs",[9,12,48,77,132,160,185,206,219,236],{"title":10,"path":6,"stem":11},"","docs/index",{"title":13,"path":14,"stem":15,"children":16,"icon":47},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[17,19,23,27,31,35,39,43],{"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},"Migrating from official PHP images","/docs/getting-started/migrating-from-official-php-images","docs/1.getting-started/7.migrating-from-official-php-images",{"title":44,"path":45,"stem":46},"Contributing","/docs/getting-started/contributing","docs/1.getting-started/99.contributing",false,{"title":49,"path":50,"stem":51,"children":52,"page":47},"Image Variations","/docs/image-variations","docs/2.image-variations",[53,57,61,65,69,73],{"title":54,"path":55,"stem":56},"CLI","/docs/image-variations/cli","docs/2.image-variations/cli",{"title":58,"path":59,"stem":60},"FPM","/docs/image-variations/fpm","docs/2.image-variations/fpm",{"title":62,"path":63,"stem":64},"FPM-Apache","/docs/image-variations/fpm-apache","docs/2.image-variations/fpm-apache",{"title":66,"path":67,"stem":68},"FPM-NGINX","/docs/image-variations/fpm-nginx","docs/2.image-variations/fpm-nginx",{"title":70,"path":71,"stem":72},"FrankenPHP","/docs/image-variations/frankenphp","docs/2.image-variations/frankenphp",{"title":74,"path":75,"stem":76},"NGINX Unit (removed)","/docs/image-variations/unit","docs/2.image-variations/unit",{"title":78,"path":79,"stem":80,"children":81,"page":47},"Framework Guides","/docs/framework-guides","docs/3.framework-guides",[82,123],{"title":83,"icon":47,"defaultOpen":47,"path":84,"stem":85,"children":86,"page":47},"Laravel","/docs/framework-guides/laravel","docs/3.framework-guides/1.laravel",[87,91,95,99,103,107,111,115,119],{"title":88,"path":89,"stem":90},"Automations","/docs/framework-guides/laravel/automations","docs/3.framework-guides/1.laravel/1.automations",{"title":92,"path":93,"stem":94},"Running workers","/docs/framework-guides/laravel/workers","docs/3.framework-guides/1.laravel/2.workers",{"title":96,"path":97,"stem":98},"Health checks","/docs/framework-guides/laravel/health-checks","docs/3.framework-guides/1.laravel/3.health-checks",{"title":100,"path":101,"stem":102},"Horizon","/docs/framework-guides/laravel/horizon","docs/3.framework-guides/1.laravel/4.horizon",{"title":104,"path":105,"stem":106},"Nightwatch","/docs/framework-guides/laravel/nightwatch","docs/3.framework-guides/1.laravel/5.nightwatch",{"title":108,"path":109,"stem":110},"Octane","/docs/framework-guides/laravel/octane","docs/3.framework-guides/1.laravel/6.octane",{"title":112,"path":113,"stem":114},"Queue","/docs/framework-guides/laravel/queue","docs/3.framework-guides/1.laravel/7.queue",{"title":116,"path":117,"stem":118},"Reverb","/docs/framework-guides/laravel/reverb","docs/3.framework-guides/1.laravel/8.reverb",{"title":120,"path":121,"stem":122},"Task scheduler","/docs/framework-guides/laravel/task-scheduler","docs/3.framework-guides/1.laravel/9.task-scheduler",{"title":124,"icon":47,"defaultOpen":47,"path":125,"stem":126,"children":127,"page":47},"WordPress","/docs/framework-guides/wordpress","docs/3.framework-guides/2.wordpress",[128],{"title":129,"path":130,"stem":131},"Using WordPress with Docker","/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":47},"Deployment And Production","/docs/deployment-and-production","docs/4.deployment-and-production",[137,141,145,148,152,156],{"title":138,"path":139,"stem":140},"Packaging your app for deployment","/docs/deployment-and-production/packaging-your-app-for-deployment","docs/4.deployment-and-production/1.packaging-your-app-for-deployment",{"title":142,"path":143,"stem":144},"Configuring SSL","/docs/deployment-and-production/configuring-ssl","docs/4.deployment-and-production/2.configuring-ssl",{"title":96,"path":146,"stem":147},"/docs/deployment-and-production/health-checks","docs/4.deployment-and-production/3.health-checks",{"title":149,"path":150,"stem":151},"Configuring trusted proxies","/docs/deployment-and-production/configuring-trusted-proxies","docs/4.deployment-and-production/4.configuring-trusted-proxies",{"title":153,"path":154,"stem":155},"Production performance tuning","/docs/deployment-and-production/production-performance-tuning","docs/4.deployment-and-production/5.production-performance-tuning",{"title":157,"path":158,"stem":159},"Choosing a host","/docs/deployment-and-production/choosing-a-host","docs/4.deployment-and-production/6.choosing-a-host",{"title":161,"icon":47,"defaultOpen":47,"path":162,"stem":163,"children":164,"page":47},"Customization","/docs/customizing-the-image","docs/5.customizing-the-image",[165,169,173,177,181],{"title":166,"path":167,"stem":168},"Changing php.ini settings","/docs/customizing-the-image/changing-common-php-settings","docs/5.customizing-the-image/1.changing-common-php-settings",{"title":170,"path":171,"stem":172},"Installing PHP extensions","/docs/customizing-the-image/installing-additional-php-extensions","docs/5.customizing-the-image/2.installing-additional-php-extensions",{"title":174,"path":175,"stem":176},"Adding start up scripts","/docs/customizing-the-image/adding-your-own-start-up-scripts","docs/5.customizing-the-image/3.adding-your-own-start-up-scripts",{"title":178,"path":179,"stem":180},"Using S6 Overlay","/docs/customizing-the-image/using-s6-overlay","docs/5.customizing-the-image/4.using-s6-overlay",{"title":182,"path":183,"stem":184},"Understanding file permissions","/docs/customizing-the-image/understanding-file-permissions","docs/5.customizing-the-image/5.understanding-file-permissions",{"title":186,"icon":47,"defaultOpen":47,"path":187,"stem":188,"children":189,"page":47},"Upgrading","/docs/upgrading","docs/6.upgrading",[190,194,198,202],{"title":191,"path":192,"stem":193},"Upgrade guide","/docs/upgrading/upgrade-guide","docs/6.upgrading/1.upgrade-guide",{"title":195,"path":196,"stem":197},"Upgrade to v5","/docs/upgrading/upgrade-to-v5","docs/6.upgrading/2.upgrade-to-v5",{"title":199,"path":200,"stem":201},"Upgrade to v4","/docs/upgrading/upgrade-to-v4","docs/6.upgrading/3.upgrade-to-v4",{"title":203,"path":204,"stem":205},"Upgrade to v3","/docs/upgrading/upgrade-to-v3","docs/6.upgrading/4.upgrade-to-v3",{"title":207,"path":208,"stem":209,"children":210,"page":47},"Troubleshooting","/docs/troubleshooting","docs/7.troubleshooting",[211,215],{"title":212,"path":213,"stem":214},"Common issues","/docs/troubleshooting/common-issues","docs/7.troubleshooting/1.common-issues",{"title":216,"path":217,"stem":218},"Getting help","/docs/troubleshooting/getting-help","docs/7.troubleshooting/2.getting-help",{"title":220,"path":221,"stem":222,"children":223,"page":47},"Security","/docs/security","docs/8.security",[224,228,232],{"title":225,"path":226,"stem":227},"How images are built","/docs/security/how-images-are-built","docs/8.security/1.how-images-are-built",{"title":229,"path":230,"stem":231},"Verifying images","/docs/security/verifying-images","docs/8.security/2.verifying-images",{"title":233,"path":234,"stem":235},"Vulnerability scanning","/docs/security/vulnerability-scanning","docs/8.security/3.vulnerability-scanning",{"title":237,"path":238,"stem":239,"children":240,"page":47},"Reference","/docs/reference","docs/9.reference",[241,245],{"title":242,"path":243,"stem":244},"Environment variable specification","/docs/reference/environment-variable-specification","docs/9.reference/1.environment-variable-specification",{"title":246,"path":247,"stem":248},"Command reference","/docs/reference/command-reference","docs/9.reference/2.command-reference",{"id":250,"title":40,"body":251,"description":938,"extension":939,"links":940,"meta":941,"navigation":301,"path":41,"redirect":940,"seo":944,"stem":42,"__hash__":945},"docs/docs/1.getting-started/7.migrating-from-official-php-images.md",{"type":252,"value":253,"toc":919},"minimark",[254,266,271,274,360,363,387,419,423,426,882,886,889,892,910,915],[255,256,257],"lead-p",{},[258,259,260,261,265],"p",{},"You already have a Dockerfile that works. It installs extensions, copies in Composer, and tweaks ",[262,263,264],"code",{},"php.ini",". Most of those lines go away when you switch. We compile PHP the same way the official images do, and your app code doesn't change.",[267,268,270],"h2",{"id":269},"most-of-your-dockerfile-goes-away","Most of your Dockerfile goes away",[258,272,273],{},"Here's a typical Laravel image built on the official Apache image:",[275,276,281],"pre",{"className":277,"code":278,"filename":279,"language":280,"meta":10,"style":10},"language-dockerfile shiki shiki-themes github-dark","FROM php:8.5-apache\n\nRUN apt-get update && apt-get install -y libzip-dev \\\n    && docker-php-ext-install pcntl pdo_mysql zip \\\n    && pecl install redis && docker-php-ext-enable redis \\\n    && a2enmod rewrite\n\nCOPY --from=composer:2 /usr/bin/composer /usr/bin/composer\nCOPY php.ini /usr/local/etc/php/conf.d/app.ini\nCOPY . /var/www/html\n","Dockerfile (before)","dockerfile",[262,282,283,296,303,312,318,324,330,335,344,352],{"__ignoreMap":10},[284,285,288,292],"span",{"class":286,"line":287},"line",1,[284,289,291],{"class":290},"snl16","FROM",[284,293,295],{"class":294},"s95oV"," php:8.5-apache\n",[284,297,299],{"class":286,"line":298},2,[284,300,302],{"emptyLinePlaceholder":301},true,"\n",[284,304,306,309],{"class":286,"line":305},3,[284,307,308],{"class":290},"RUN",[284,310,311],{"class":294}," apt-get update && apt-get install -y libzip-dev \\\n",[284,313,315],{"class":286,"line":314},4,[284,316,317],{"class":294},"    && docker-php-ext-install pcntl pdo_mysql zip \\\n",[284,319,321],{"class":286,"line":320},5,[284,322,323],{"class":294},"    && pecl install redis && docker-php-ext-enable redis \\\n",[284,325,327],{"class":286,"line":326},6,[284,328,329],{"class":294},"    && a2enmod rewrite\n",[284,331,333],{"class":286,"line":332},7,[284,334,302],{"emptyLinePlaceholder":301},[284,336,338,341],{"class":286,"line":337},8,[284,339,340],{"class":290},"COPY",[284,342,343],{"class":294}," --from=composer:2 /usr/bin/composer /usr/bin/composer\n",[284,345,347,349],{"class":286,"line":346},9,[284,348,340],{"class":290},[284,350,351],{"class":294}," php.ini /usr/local/etc/php/conf.d/app.ini\n",[284,353,355,357],{"class":286,"line":354},10,[284,356,340],{"class":290},[284,358,359],{"class":294}," . /var/www/html\n",[258,361,362],{},"Here's the same app on ours:",[275,364,367],{"className":277,"code":365,"filename":366,"language":280,"meta":10,"style":10},"FROM serversideup/php:8.5-fpm-apache\n\nCOPY --chown=www-data:www-data . /var/www/html\n","Dockerfile (after)",[262,368,369,376,380],{"__ignoreMap":10},[284,370,371,373],{"class":286,"line":287},[284,372,291],{"class":290},[284,374,375],{"class":294}," serversideup/php:8.5-fpm-apache\n",[284,377,378],{"class":286,"line":298},[284,379,302],{"emptyLinePlaceholder":301},[284,381,382,384],{"class":286,"line":305},[284,383,340],{"class":290},[284,385,386],{"class":294}," --chown=www-data:www-data . /var/www/html\n",[258,388,389,392,393,392,396,399,400,403,404,407,408,410,411,414,415,418],{},[262,390,391],{},"pcntl",", ",[262,394,395],{},"pdo_mysql",[262,397,398],{},"redis",", and ",[262,401,402],{},"zip"," are already installed. So are Composer and Apache's ",[262,405,406],{},"rewrite"," module. The ",[262,409,264],{}," settings move to environment variables in your Compose file. The container runs as ",[262,412,413],{},"www-data"," instead of ",[262,416,417],{},"root",".",[267,420,422],{"id":421},"switch-in-eight-steps","Switch in eight steps",[258,424,425],{},"Work through these in development first.",[427,428,430,435,503,510,514,538,601,604,612,634,650,657,677,696,701,707,715,752,765,772,782,795,807,826,837,841,868],"steps",{"level":429},"3",[431,432,434],"h3",{"id":433},"change-the-image","Change the image",[436,437,438,451],"table",{},[439,440,441],"thead",{},[442,443,444,448],"tr",{},[445,446,447],"th",{},"Official image",[445,449,450],{},"Replace with",[452,453,454,467,479,491],"tbody",{},[442,455,456,462],{},[457,458,459],"td",{},[262,460,461],{},"php:8.5-cli",[457,463,464],{},[262,465,466],{},"serversideup/php:8.5-cli",[442,468,469,474],{},[457,470,471],{},[262,472,473],{},"php:8.5-fpm",[457,475,476],{},[262,477,478],{},"serversideup/php:8.5-fpm",[442,480,481,486],{},[457,482,483],{},[262,484,485],{},"php:8.5-apache",[457,487,488],{},[262,489,490],{},"serversideup/php:8.5-fpm-apache",[442,492,493,498],{},[457,494,495,497],{},[262,496,473],{}," plus an NGINX container",[457,499,500],{},[262,501,502],{},"serversideup/php:8.5-fpm-nginx",[258,504,505,506,509],{},"Not sure which fits? ",[507,508,32],"a",{"href":33}," compares all five.",[431,511,513],{"id":512},"map-the-new-ports","Map the new ports",[258,515,516,517,520,521,414,524,520,527,530,531,534,535,418],{},"Web server variations listen on ",[262,518,519],{},"8080"," and ",[262,522,523],{},"8443",[262,525,526],{},"80",[262,528,529],{},"443",". ",[262,532,533],{},"fpm"," still uses ",[262,536,537],{},"9000",[275,539,545],{"className":540,"code":541,"filename":542,"highlights":543,"language":544,"meta":10,"style":10},"language-yaml shiki shiki-themes github-dark","services:\n  php:\n    image: serversideup/php:8.5-fpm-apache\n    ports:\n      - 80:8080\n      - 443:8443\n","compose.yml",[305,320,326],"yaml",[262,546,547,556,563,577,584,593],{"__ignoreMap":10},[284,548,549,553],{"class":286,"line":287},[284,550,552],{"class":551},"s4JwU","services",[284,554,555],{"class":294},":\n",[284,557,558,561],{"class":286,"line":298},[284,559,560],{"class":551},"  php",[284,562,555],{"class":294},[284,564,567,570,573],{"class":565,"line":305},[286,566],"highlight",[284,568,569],{"class":551},"    image",[284,571,572],{"class":294},": ",[284,574,576],{"class":575},"sU2Wk","serversideup/php:8.5-fpm-apache\n",[284,578,579,582],{"class":286,"line":314},[284,580,581],{"class":551},"    ports",[284,583,555],{"class":294},[284,585,587,590],{"class":586,"line":320},[286,566],[284,588,589],{"class":294},"      - ",[284,591,592],{"class":575},"80:8080\n",[284,594,596,598],{"class":595,"line":326},[286,566],[284,597,589],{"class":294},[284,599,600],{"class":575},"443:8443\n",[258,602,603],{},"Update anything else that connects to the container directly, such as a load balancer's health check.",[431,605,607,608,611],{"id":606},"serve-from-public-or-change-the-web-root","Serve from ",[262,609,610],{},"public/",", or change the web root",[258,613,614,392,617,399,620,623,624,627,628,631,632,418],{},[262,615,616],{},"fpm-nginx",[262,618,619],{},"fpm-apache",[262,621,622],{},"frankenphp"," serve ",[262,625,626],{},"/var/www/html/public",", not ",[262,629,630],{},"/var/www/html",". Laravel and Symfony already use ",[262,633,610],{},[258,635,636,637,392,640,643,644,647,648,418],{},"For an app that serves from the project root, such as WordPress, set ",[262,638,639],{},"NGINX_WEBROOT",[262,641,642],{},"APACHE_DOCUMENT_ROOT",", or ",[262,645,646],{},"CADDY_SERVER_ROOT"," to ",[262,649,630],{},[431,651,653,654,656],{"id":652},"give-www-data-your-files","Give ",[262,655,413],{}," your files",[258,658,659,660,627,662,664,665,668,669,672,673,676],{},"Containers run as ",[262,661,413],{},[262,663,417],{},". The user ID is ",[262,666,667],{},"33"," on Debian and ",[262,670,671],{},"82"," on Alpine. That user must own anything your app writes to, such as Laravel's ",[262,674,675],{},"storage/",":",[275,678,681],{"className":277,"code":679,"filename":680,"language":280,"meta":10,"style":10},"FROM serversideup/php:8.5-fpm-nginx\nCOPY --chown=www-data:www-data . /var/www/html\n","Dockerfile",[262,682,683,690],{"__ignoreMap":10},[284,684,685,687],{"class":286,"line":287},[284,686,291],{"class":290},[284,688,689],{"class":294}," serversideup/php:8.5-fpm-nginx\n",[284,691,692,694],{"class":286,"line":298},[284,693,340],{"class":290},[284,695,386],{"class":294},[258,697,698,699,418],{},"For mounted volumes, see ",[507,700,182],{"href":183},[431,702,704,705],{"id":703},"install-extras-as-root","Install extras as ",[262,706,417],{},[258,708,709,710,712,713,676],{},"Package and extension installs need root. Switch to ",[262,711,417],{}," for those steps, then back to ",[262,714,413],{},[275,716,718],{"className":277,"code":717,"filename":680,"language":280,"meta":10,"style":10},"FROM serversideup/php:8.5-fpm-nginx\n\nUSER root\nRUN install-php-extensions intl bcmath\nUSER www-data\n",[262,719,720,726,730,738,745],{"__ignoreMap":10},[284,721,722,724],{"class":286,"line":287},[284,723,291],{"class":290},[284,725,689],{"class":294},[284,727,728],{"class":286,"line":298},[284,729,302],{"emptyLinePlaceholder":301},[284,731,732,735],{"class":286,"line":305},[284,733,734],{"class":290},"USER",[284,736,737],{"class":294}," root\n",[284,739,740,742],{"class":286,"line":314},[284,741,308],{"class":290},[284,743,744],{"class":294}," install-php-extensions intl bcmath\n",[284,746,747,749],{"class":286,"line":320},[284,748,734],{"class":290},[284,750,751],{"class":294}," www-data\n",[258,753,754,757,758,761,762,418],{},[262,755,756],{},"install-php-extensions"," installs each extension's system libraries for you. ",[262,759,760],{},"docker-php-ext-install"," still works too. See ",[507,763,764],{"href":171},"Installing additional PHP extensions",[431,766,768,769,771],{"id":767},"swap-phpini-for-environment-variables","Swap ",[262,770,264],{}," for environment variables",[258,773,774,775,777,778,781],{},"Most settings you'd copy in a ",[262,776,264],{}," have an environment variable, such as ",[262,779,780],{},"PHP_MEMORY_LIMIT",". Set them in your Compose file and drop the file.",[258,783,784,785,788,789,792,793,418],{},"If you keep an ini file, name it to load after ours, such as ",[262,786,787],{},"zzz-custom-php.ini",". OPcache is off by default. Set ",[262,790,791],{},"PHP_OPCACHE_ENABLE=1"," in production. See ",[507,794,166],{"href":167},[431,796,798,799,802,803,806],{"id":797},"move-php_value-out-of-htaccess-apache-only","Move ",[262,800,801],{},"php_value"," out of ",[262,804,805],{},".htaccess"," (Apache only)",[258,808,809,810,813,814,816,817,520,819,822,823,825],{},"The official Apache image runs PHP as ",[262,811,812],{},"mod_php",". Our ",[262,815,619],{}," runs PHP-FPM. Apache returns a 500 error for ",[262,818,801],{},[262,820,821],{},"php_flag"," lines in ",[262,824,805],{},". Move those settings to environment variables or an ini file.",[258,827,828,830,831,834,835,418],{},[262,829,619],{}," also blocks ",[262,832,833],{},"xmlrpc.php",". WordPress features that use it, such as Jetpack and the mobile app, stop working. See ",[507,836,129],{"href":130},[431,838,840],{"id":839},"keep-our-entrypoint-and-default-command","Keep our entrypoint and default command",[258,842,843,844,520,847,850,851,854,855,858,859,520,861,863,864,867],{},"Remove ",[262,845,846],{},"ENTRYPOINT",[262,848,849],{},"CMD"," lines you carried over, such as ",[262,852,853],{},"CMD [\"apache2-foreground\"]",". Our entrypoint runs the ",[507,856,857],{"href":175},"start-up scripts",", then the default command. On ",[262,860,616],{},[262,862,619],{}," that's ",[262,865,866],{},"/init",", which starts the web server and PHP-FPM together. A different command skips the web server.",[258,869,870,871,520,874,877,878,881],{},"Our PHP-FPM pool replaces the stock ",[262,872,873],{},"www.conf",[262,875,876],{},"zz-docker.conf",". Set pool options with ",[262,879,880],{},"PHP_FPM_*"," variables instead of copying those files in.",[267,883,885],{"id":884},"test-it-then-ship-it","Test it, then ship it",[258,887,888],{},"Run your app and its tests against the new image in development or staging. Watch the container logs for permission errors.",[258,890,891],{},"Once it's running, two features are worth turning on:",[893,894,895,902],"ul",{},[896,897,898,901],"li",{},[507,899,900],{"href":89},"Laravel automations"," run your migrations and caching at startup.",[896,903,904,909],{},[507,905,906],{"href":97},[262,907,908],{},"HEALTHCHECK_PATH: \"/up\""," makes Docker check that Laravel boots.",[258,911,912,914],{},[507,913,36],{"href":37}," lists everything else the image does for you.",[916,917,918],"style",{},"html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}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 .snl16, html code.shiki .snl16{--shiki-default:#F97583}",{"title":10,"searchDepth":298,"depth":298,"links":920},[921,922,937],{"id":269,"depth":298,"text":270},{"id":421,"depth":298,"text":422,"children":923},[924,925,926,928,930,932,934,936],{"id":433,"depth":305,"text":434},{"id":512,"depth":305,"text":513},{"id":606,"depth":305,"text":927},"Serve from public/, or change the web root",{"id":652,"depth":305,"text":929},"Give www-data your files",{"id":703,"depth":305,"text":931},"Install extras as root",{"id":767,"depth":305,"text":933},"Swap php.ini for environment variables",{"id":797,"depth":305,"text":935},"Move php_value out of .htaccess (Apache only)",{"id":839,"depth":305,"text":840},{"id":884,"depth":298,"text":885},"Move a project from the official PHP images to serversideup/php in eight steps. Your app code stays the same.","md",null,{"head":942,"layout":7},{"title":943},"Migrating from official PHP Docker images - Docker PHP - Server Side Up",{"title":40,"description":938},"eKhQfo8kG9ZPh3z9IyUXDTFTicRhCI0qMQXF4VXe7QI",[947,949],{"title":36,"path":37,"stem":38,"description":948,"children":-1},"The user, ports, PHP settings, extensions, packages, health checks, logging, and startup scripts every serversideup/php image ships with.",{"title":44,"path":45,"stem":46,"description":950,"children":-1},"Build and test serversideup/php images locally, run the same checks as CI, and open a pull request.",1793811939002]