[{"data":1,"prerenderedAt":850},["ShallowReactive",2],{"navigation":3,"/docs/customizing-the-image/using-s6-overlay":249,"/docs/customizing-the-image/using-s6-overlay-surround":845},[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":178,"body":251,"description":837,"extension":838,"links":839,"meta":840,"navigation":446,"path":179,"redirect":839,"seo":843,"stem":180,"__hash__":844},"docs/docs/5.customizing-the-image/4.using-s6-overlay.md",{"type":252,"value":253,"toc":829},"minimark",[254,279,284,291,310,322,327,334,337,343,346,350,390,393,397,416,535,579,604,610,614,625,699,708,749,755,758,793,804,816,825],[255,256,257],"lead-p",{},[258,259,260,261,265,266,269,270,278],"p",{},"The ",[262,263,264],"code",{},"fpm-nginx"," and ",[262,267,268],{},"fpm-apache"," images use ",[271,272,277],"a",{"href":273,"rel":274,"target":276},"https://github.com/just-containers/s6-overlay",[275],"nofollow","_blank","S6 Overlay"," to run PHP-FPM and the web server in one container. You can add your own long-running process, such as a worker, as another S6 service.",[280,281,283],"h2",{"id":282},"why-these-images-run-two-processes","Why these images run two processes",[258,285,286,287,290],{},"NGINX and Apache serve static files and pass PHP requests to PHP-FPM. A PHP request needs both processes running. S6 Overlay is a process supervisor built for containers. It starts PHP-FPM and waits until it is ready before it starts the web server. It restarts either one if it crashes. If a service fails to start, S6 stops the container. The image's health check requests ",[262,288,289],{},"/healthcheck"," through the web server to PHP-FPM. When either process is down, the container reports unhealthy.",[258,292,293,294,297,298,301,302,305,306,309],{},"The other images don't use S6. ",[262,295,296],{},"cli"," runs your command, ",[262,299,300],{},"fpm"," runs ",[262,303,304],{},"php-fpm"," alone, and ",[262,307,308],{},"frankenphp"," serves PHP and static files from one process.",[311,312,313],"note",{},[258,314,315,316,321],{},"Some PaaS providers run containers in a way S6 Overlay doesn't support. See ",[271,317,320],{"href":318,"rel":319,"target":276},"https://github.com/just-containers/s6-overlay/issues/535#issuecomment-1597680218",[275],"this comment from the S6 Overlay author",".",[323,324,326],"h3",{"id":325},"s6-overlay-compared-to-supervisor","S6 Overlay compared to Supervisor",[258,328,329],{},[330,331],"img",{"alt":332,"src":333},"Supervisor runs as PID 1 and keeps reporting the container as healthy while its child process fails","images/docs/supervisor-container.svg",[258,335,336],{},"Supervisor also restarts child processes. It runs as PID 1 and wasn't built for containers. While a child process is failing, Supervisor keeps running, so the orchestrator still sees a healthy container.",[258,338,339],{},[330,340],{"alt":341,"src":342},"S6 Overlay supervises PHP-FPM and NGINX inside the container","images/docs/s6-overlay-container.svg",[258,344,345],{},"With S6 Overlay, a service that fails to start stops the container. A process that is down fails the health check.",[280,347,349],{"id":348},"how-the-container-starts","How the container starts",[351,352,353,368,374],"ol",{},[354,355,356,359,360,363,364,367],"li",{},[262,357,358],{},"docker-php-serversideup-entrypoint"," runs every script in ",[262,361,362],{},"/etc/entrypoint.d/"," in order. See ",[271,365,366],{"href":175},"adding start up scripts"," for the list.",[354,369,370,371,321],{},"It starts S6 Overlay with ",[262,372,373],{},"/init",[354,375,376,377,379,380,383,384,387,388,321],{},"S6 starts the ",[262,378,304],{}," service, then ",[262,381,382],{},"nginx"," or ",[262,385,386],{},"apache2",", which depend on ",[262,389,304],{},[258,391,392],{},"Every service starts after all the entrypoint scripts have finished.",[280,394,396],{"id":395},"add-a-long-running-service","Add a long-running service",[258,398,399,400,403,404,407,408,411,412,415],{},"An S6 service is a directory in ",[262,401,402],{},"/etc/s6-overlay/s6-rc.d/"," with a ",[262,405,406],{},"type"," file, a ",[262,409,410],{},"run"," script, and a ",[262,413,414],{},"dependencies.d"," directory. This one runs a PHP script that never exits:",[417,418,420,493,502,529],"code-tree",{"default-value":419},"Dockerfile",[421,422,426],"pre",{"className":423,"code":424,"filename":419,"language":425,"meta":10,"style":10},"language-dockerfile shiki shiki-themes github-dark","FROM serversideup/php:8.5-fpm-nginx\n\nUSER root\n\nCOPY --chmod=755 ./my-worker/ /etc/s6-overlay/s6-rc.d/my-worker/\nRUN touch /etc/s6-overlay/user-bundles.d/user/contents.d/my-worker\n\nUSER www-data\n","dockerfile",[262,427,428,441,448,457,462,471,480,485],{"__ignoreMap":10},[429,430,433,437],"span",{"class":431,"line":432},"line",1,[429,434,436],{"class":435},"snl16","FROM",[429,438,440],{"class":439},"s95oV"," serversideup/php:8.5-fpm-nginx\n",[429,442,444],{"class":431,"line":443},2,[429,445,447],{"emptyLinePlaceholder":446},true,"\n",[429,449,451,454],{"class":431,"line":450},3,[429,452,453],{"class":435},"USER",[429,455,456],{"class":439}," root\n",[429,458,460],{"class":431,"line":459},4,[429,461,447],{"emptyLinePlaceholder":446},[429,463,465,468],{"class":431,"line":464},5,[429,466,467],{"class":435},"COPY",[429,469,470],{"class":439}," --chmod=755 ./my-worker/ /etc/s6-overlay/s6-rc.d/my-worker/\n",[429,472,474,477],{"class":431,"line":473},6,[429,475,476],{"class":435},"RUN",[429,478,479],{"class":439}," touch /etc/s6-overlay/user-bundles.d/user/contents.d/my-worker\n",[429,481,483],{"class":431,"line":482},7,[429,484,447],{"emptyLinePlaceholder":446},[429,486,488,490],{"class":431,"line":487},8,[429,489,453],{"class":435},[429,491,492],{"class":439}," www-data\n",[421,494,500],{"className":495,"code":497,"filename":498,"language":499,"meta":10},[496],"language-text","longrun\n","my-worker/type","text",[262,501,497],{"__ignoreMap":10},[421,503,508],{"className":504,"code":505,"filename":506,"language":507,"meta":10,"style":10},"language-sh shiki shiki-themes github-dark","#!/command/with-contenv sh\nexec php /var/www/html/worker.php\n","my-worker/run","sh",[262,509,510,516],{"__ignoreMap":10},[429,511,512],{"class":431,"line":432},[429,513,515],{"class":514},"sAwPA","#!/command/with-contenv sh\n",[429,517,518,522,526],{"class":431,"line":443},[429,519,521],{"class":520},"sDLfK","exec",[429,523,525],{"class":524},"sU2Wk"," php",[429,527,528],{"class":524}," /var/www/html/worker.php\n",[421,530,533],{"className":531,"code":10,"filename":532,"language":499,"meta":10},[496],"my-worker/dependencies.d/base",[262,534,10],{"__ignoreMap":10},[536,537,538,547,559,572],"ul",{},[354,539,540,542,543,546],{},[262,541,406],{}," is ",[262,544,545],{},"longrun"," for a process S6 keeps running and restarts.",[354,548,549,551,552,555,556,558],{},[262,550,410],{}," starts the process. ",[262,553,554],{},"with-contenv"," passes the container's environment variables to it, and ",[262,557,521],{}," replaces the shell so S6 supervises PHP directly.",[354,560,561,562,565,566,571],{},"The empty ",[262,563,564],{},"dependencies.d/base"," file makes the service wait for S6's own setup, which ",[271,567,570],{"href":568,"rel":569,"target":276},"https://github.com/just-containers/s6-overlay#writing-a-service-script",[275],"S6 Overlay recommends"," for every service.",[354,573,574,575,578],{},"The empty file in ",[262,576,577],{},"/etc/s6-overlay/user-bundles.d/user/contents.d/"," registers the service. S6 only starts services listed there.",[580,581,582],"warning",{},[258,583,584,585,588,589,592,593,596,597,600,601,321],{},"Use ",[262,586,587],{},"user-bundles.d/user/contents.d/",", not the older ",[262,590,591],{},"s6-rc.d/user/contents.d/",". Since S6 Overlay 3.2.3.2, the old location makes startup try to write to ",[262,594,595],{},"/etc/s6-overlay",", which fails as ",[262,598,599],{},"www-data",", so the container doesn't boot. See ",[271,602,603],{"href":196},"upgrading to v5",[258,605,606,607,609],{},"The service runs as ",[262,608,599],{},", like the rest of the container.",[280,611,613],{"id":612},"start-a-service-between-the-startup-scripts","Start a service between the startup scripts",[258,615,616,617,620,621,624],{},"Because the entrypoint scripts finish before S6 starts, a service can't run in the middle of them. If it needs to, for example a database proxy that must be up before ",[262,618,619],{},"50-laravel-automations.sh"," runs migrations, convert the scripts to S6 services with ",[262,622,623],{},"docker-php-serversideup-s6-init",":",[421,626,628],{"className":423,"code":627,"filename":419,"language":425,"meta":10,"style":10},"FROM serversideup/php:8.5-fpm-nginx\n\nUSER root\n\n# Your own startup scripts, if you have any\nCOPY --chmod=755 ./entrypoint.d/ /etc/entrypoint.d/\nRUN docker-php-serversideup-s6-init\n\nCOPY --chmod=755 ./my-worker/ /etc/s6-overlay/s6-rc.d/my-worker/\nRUN touch /etc/s6-overlay/user-bundles.d/user/contents.d/my-worker\n\nUSER www-data\n",[262,629,630,636,640,646,650,655,662,669,673,680,687,692],{"__ignoreMap":10},[429,631,632,634],{"class":431,"line":432},[429,633,436],{"class":435},[429,635,440],{"class":439},[429,637,638],{"class":431,"line":443},[429,639,447],{"emptyLinePlaceholder":446},[429,641,642,644],{"class":431,"line":450},[429,643,453],{"class":435},[429,645,456],{"class":439},[429,647,648],{"class":431,"line":459},[429,649,447],{"emptyLinePlaceholder":446},[429,651,652],{"class":431,"line":464},[429,653,654],{"class":514},"# Your own startup scripts, if you have any\n",[429,656,657,659],{"class":431,"line":473},[429,658,467],{"class":435},[429,660,661],{"class":439}," --chmod=755 ./entrypoint.d/ /etc/entrypoint.d/\n",[429,663,664,666],{"class":431,"line":482},[429,665,476],{"class":435},[429,667,668],{"class":439}," docker-php-serversideup-s6-init\n",[429,670,671],{"class":431,"line":487},[429,672,447],{"emptyLinePlaceholder":446},[429,674,676,678],{"class":431,"line":675},9,[429,677,467],{"class":435},[429,679,470],{"class":439},[429,681,683,685],{"class":431,"line":682},10,[429,684,476],{"class":435},[429,686,479],{"class":439},[429,688,690],{"class":431,"line":689},11,[429,691,447],{"emptyLinePlaceholder":446},[429,693,695,697],{"class":431,"line":694},12,[429,696,453],{"class":435},[429,698,492],{"class":439},[258,700,701,703,704,707],{},[262,702,623],{}," must run as ",[262,705,706],{},"root",". It:",[536,709,710,731,734,746],{},[354,711,712,713,715,716,719,720,723,724,727,728,321],{},"Moves every script from ",[262,714,362],{}," to ",[262,717,718],{},"/etc/s6-overlay/scripts/"," and makes each one an S6 oneshot service named after the file without ",[262,721,722],{},".sh",". For example, ",[262,725,726],{},"10-init-webserver-config.sh"," becomes ",[262,729,730],{},"10-init-webserver-config",[354,732,733],{},"Chains the oneshots so they run in the same order the entrypoint would have used.",[354,735,736,737,739,740,742,743,745],{},"Makes ",[262,738,304],{},", ",[262,741,382],{},", and ",[262,744,386],{}," wait for the last oneshot.",[354,747,748],{},"Can run again in an image built from yours. New scripts join the existing order, and a script with the same name replaces the earlier one.",[258,750,751,752,754],{},"Copy your startup scripts into ",[262,753,362],{}," before you run it. Scripts added afterward run from the entrypoint before S6 starts.",[258,756,757],{},"Your service can now depend on any script by name. Add an empty file for each dependency:",[421,759,764],{"className":760,"code":761,"filename":762,"language":763,"meta":10,"style":10},"language-bash shiki shiki-themes github-dark","mkdir -p my-worker/dependencies.d\ntouch my-worker/dependencies.d/base\ntouch my-worker/dependencies.d/10-init-webserver-config\n","Terminal","bash",[262,765,766,778,786],{"__ignoreMap":10},[429,767,768,772,775],{"class":431,"line":432},[429,769,771],{"class":770},"svObZ","mkdir",[429,773,774],{"class":520}," -p",[429,776,777],{"class":524}," my-worker/dependencies.d\n",[429,779,780,783],{"class":431,"line":443},[429,781,782],{"class":770},"touch",[429,784,785],{"class":524}," my-worker/dependencies.d/base\n",[429,787,788,790],{"class":431,"line":450},[429,789,782],{"class":770},[429,791,792],{"class":524}," my-worker/dependencies.d/10-init-webserver-config\n",[258,794,795,796,798,799,801,802,624],{},"To make a script wait for your service instead, add a file named after your service to that script's ",[262,797,414],{}," in a ",[262,800,476],{}," step after ",[262,803,623],{},[421,805,807],{"className":423,"code":806,"filename":419,"language":425,"meta":10,"style":10},"RUN touch /etc/s6-overlay/s6-rc.d/50-laravel-automations/dependencies.d/my-worker\n",[262,808,809],{"__ignoreMap":10},[429,810,811,813],{"class":431,"line":432},[429,812,476],{"class":435},[429,814,815],{"class":439}," touch /etc/s6-overlay/s6-rc.d/50-laravel-automations/dependencies.d/my-worker\n",[258,817,818,819,821,822,824],{},"S6 counts a ",[262,820,545],{}," service as up as soon as its ",[262,823,410],{}," script starts. Your process may still be starting when the script runs.",[826,827,828],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":10,"searchDepth":443,"depth":443,"links":830},[831,834,835,836],{"id":282,"depth":443,"text":283,"children":832},[833],{"id":325,"depth":450,"text":326},{"id":348,"depth":443,"text":349},{"id":395,"depth":443,"text":396},{"id":612,"depth":443,"text":613},"How the fpm-nginx and fpm-apache images use S6 Overlay, and how to add your own long-running service.","md",null,{"head":841,"layout":7},{"title":842},"Using S6 Overlay - Docker PHP - Server Side Up",{"title":178,"description":837},"lF8CAJB5xgFX2WEjHv43CQ87whkAh_s_vMBk1ySk_YM",[846,848],{"title":174,"path":175,"stem":176,"description":847,"children":-1},"Run your own shell scripts when the container starts, in a set order with the default scripts.",{"title":182,"path":183,"stem":184,"description":849,"children":-1},"Match the container user to your host user in development while keeping production images unprivileged.",1793811957364]