kopia lustrzana https://github.com/linuxserver/docker-documentation
86 wiersze
60 KiB
HTML
86 wiersze
60 KiB
HTML
<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Welcome to the home of the LinuxServer.io documentation!"><meta name=author content=LinuxServer.io><link href=https://docs.linuxserver.io/general/docker-compose/ rel=canonical><link href=../container-customization/ rel=prev><link href=../understanding-puid-and-pgid/ rel=next><link rel=icon href="https://gblobscdn.gitbook.com/spaces%2F-LWuIse8qFJj2MqDi90T%2Favatar-1590244439115.png?alt=media"><meta name=generator content="mkdocs-1.4.2, mkdocs-material-9.1.8"><title>Docker Compose - LinuxServer.io</title><link rel=stylesheet href=../../assets/stylesheets/main.ded33207.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.a0c5b2b5.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=purple data-md-color-accent=indigo> <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#docker-compose class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class="md-header md-header--shadow" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../.. title=LinuxServer.io class="md-header__button md-logo" aria-label=LinuxServer.io data-md-component=logo> <img src="https://gblobscdn.gitbook.com/spaces%2F-LWuIse8qFJj2MqDi90T%2Favatar-1590244439115.png?alt=media" alt=logo> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> LinuxServer.io </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Docker Compose </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme=default data-md-color-primary=purple data-md-color-accent=indigo aria-label="Switch to dark mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_2 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6zm0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4zM7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme=slate data-md-color-primary=purple data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_2> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3Z"/></svg> </label> </form> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> </button> </nav> </form> <div class=md-search__output> <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/linuxserver/docker-documentation title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class=md-source__repository> linuxserver/docker-documentation </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../.. title=LinuxServer.io class="md-nav__button md-logo" aria-label=LinuxServer.io data-md-component=logo> <img src="https://gblobscdn.gitbook.com/spaces%2F-LWuIse8qFJj2MqDi90T%2Favatar-1590244439115.png?alt=media" alt=logo> </a> LinuxServer.io </label> <div class=md-nav__source> <a href=https://github.com/linuxserver/docker-documentation title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class=md-source__repository> linuxserver/docker-documentation </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../.. class=md-nav__link> Introduction </a> </li> <li class=md-nav__item> <a href=../../FAQ/ class=md-nav__link> FAQ </a> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3 checked> <label class=md-nav__link for=__nav_3 id=__nav_3_label tabindex=0> General <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_3_label aria-expanded=true> <label class=md-nav__title for=__nav_3> <span class="md-nav__icon md-icon"></span> General </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../container-execution/ class=md-nav__link> Container Execution </a> </li> <li class=md-nav__item> <a href=../containers-101/ class=md-nav__link> Docker Containers: 101 </a> </li> <li class=md-nav__item> <a href=../running-our-containers/ class=md-nav__link> Running LinuxServer Containers </a> </li> <li class=md-nav__item> <a href=../container-customization/ class=md-nav__link> Customizing LinuxServer Containers </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> Docker Compose <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> Docker Compose </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#intro class=md-nav__link> Intro </a> </li> <li class=md-nav__item> <a href=#installation class=md-nav__link> Installation </a> </li> <li class=md-nav__item> <a href=#single-service-usage class=md-nav__link> Single service Usage </a> </li> <li class=md-nav__item> <a href=#multiple-service-usage class=md-nav__link> Multiple Service Usage </a> </li> <li class=md-nav__item> <a href=#updates class=md-nav__link> Updates </a> </li> <li class=md-nav__item> <a href=#support-requests class=md-nav__link> Support Requests </a> </li> <li class=md-nav__item> <a href=#common-gotchas class=md-nav__link> Common Gotchas </a> <nav class=md-nav aria-label="Common Gotchas"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#quoting-variables class=md-nav__link> Quoting variables </a> </li> <li class=md-nav__item> <a href=#escaping-signs class=md-nav__link> Escaping $ signs </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#tips-tricks class=md-nav__link> Tips & Tricks </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../understanding-puid-and-pgid/ class=md-nav__link> Understanding PUID and PGID </a> </li> <li class=md-nav__item> <a href=../updating-our-containers/ class=md-nav__link> Updating our containers </a> </li> <li class=md-nav__item> <a href=../volumes/ class=md-nav__link> Volumes </a> </li> <li class=md-nav__item> <a href=../fleet/ class=md-nav__link> Fleet </a> </li> <li class=md-nav__item> <a href=../swag/ class=md-nav__link> SWAG </a> </li> <li class=md-nav__item> <a href=../awesome-lsio/ class=md-nav__link> Awesome LSIO </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_4> <label class=md-nav__link for=__nav_4 id=__nav_4_label tabindex=0> Images <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_4_label aria-expanded=false> <label class=md-nav__title for=__nav_4> <span class="md-nav__icon md-icon"></span> Images </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../images/docker-adguardhome-sync/ class=md-nav__link> adguardhome-sync </a> </li> <li class=md-nav__item> <a href=../../images/docker-airsonic-advanced/ class=md-nav__link> airsonic-advanced </a> </li> <li class=md-nav__item> <a href=../../images/docker-airsonic/ class=md-nav__link> airsonic </a> </li> <li class=md-nav__item> <a href=../../images/docker-apprise-api/ class=md-nav__link> apprise-api </a> </li> <li class=md-nav__item> <a href=../../images/docker-audacity/ class=md-nav__link> audacity </a> </li> <li class=md-nav__item> <a href=../../images/docker-babybuddy/ class=md-nav__link> babybuddy </a> </li> <li class=md-nav__item> <a href=../../images/docker-bazarr/ class=md-nav__link> bazarr </a> </li> <li class=md-nav__item> <a href=../../images/docker-beets/ class=md-nav__link> beets </a> </li> <li class=md-nav__item> <a href=../../images/docker-blender/ class=md-nav__link> blender </a> </li> <li class=md-nav__item> <a href=../../images/docker-boinc/ class=md-nav__link> boinc </a> </li> <li class=md-nav__item> <a href=../../images/docker-booksonic-air/ class=md-nav__link> booksonic-air </a> </li> <li class=md-nav__item> <a href=../../images/docker-booksonic/ class=md-nav__link> booksonic </a> </li> <li class=md-nav__item> <a href=../../images/docker-bookstack/ class=md-nav__link> bookstack </a> </li> <li class=md-nav__item> <a href=../../images/docker-budge/ class=md-nav__link> budge </a> </li> <li class=md-nav__item> <a href=../../images/docker-calibre-web/ class=md-nav__link> calibre-web </a> </li> <li class=md-nav__item> <a href=../../images/docker-calibre/ class=md-nav__link> calibre </a> </li> <li class=md-nav__item> <a href=../../images/docker-cardigann/ class=md-nav__link> cardigann </a> </li> <li class=md-nav__item> <a href=../../images/docker-changedetection.io/ class=md-nav__link> changedetection.io </a> </li> <li class=md-nav__item> <a href=../../images/docker-chevereto/ class=md-nav__link> chevereto </a> </li> <li class=md-nav__item> <a href=../../images/docker-chromium/ class=md-nav__link> chromium </a> </li> <li class=md-nav__item> <a href=../../images/docker-clarkson/ class=md-nav__link> clarkson </a> </li> <li class=md-nav__item> <a href=../../images/docker-cloud9/ class=md-nav__link> cloud9 </a> </li> <li class=md-nav__item> <a href=../../images/docker-code-server/ class=md-nav__link> code-server </a> </li> <li class=md-nav__item> <a href=../../images/docker-codiad/ class=md-nav__link> codiad </a> </li> <li class=md-nav__item> <a href=../../images/docker-codimd/ class=md-nav__link> codimd </a> </li> <li class=md-nav__item> <a href=../../images/docker-cops/ class=md-nav__link> cops </a> </li> <li class=md-nav__item> <a href=../../images/docker-couchpotato/ class=md-nav__link> couchpotato </a> </li> <li class=md-nav__item> <a href=../../images/docker-daapd/ class=md-nav__link> daapd </a> </li> <li class=md-nav__item> <a href=../../images/docker-darktable/ class=md-nav__link> darktable </a> </li> <li class=md-nav__item> <a href=../../images/docker-davos/ class=md-nav__link> davos </a> </li> <li class=md-nav__item> <a href=../../images/docker-ddclient/ class=md-nav__link> ddclient </a> </li> <li class=md-nav__item> <a href=../../images/docker-deluge/ class=md-nav__link> deluge </a> </li> <li class=md-nav__item> <a href=../../images/docker-digikam/ class=md-nav__link> digikam </a> </li> <li class=md-nav__item> <a href=../../images/docker-dillinger/ class=md-nav__link> dillinger </a> </li> <li class=md-nav__item> <a href=../../images/docker-diskover/ class=md-nav__link> diskover </a> </li> <li class=md-nav__item> <a href=../../images/docker-docker-compose/ class=md-nav__link> docker-compose </a> </li> <li class=md-nav__item> <a href=../../images/docker-dokuwiki/ class=md-nav__link> dokuwiki </a> </li> <li class=md-nav__item> <a href=../../images/docker-domoticz/ class=md-nav__link> domoticz </a> </li> <li class=md-nav__item> <a href=../../images/docker-doplarr/ class=md-nav__link> doplarr </a> </li> <li class=md-nav__item> <a href=../../images/docker-doublecommander/ class=md-nav__link> doublecommander </a> </li> <li class=md-nav__item> <a href=../../images/docker-duckdns/ class=md-nav__link> duckdns </a> </li> <li class=md-nav__item> <a href=../../images/docker-duplicati/ class=md-nav__link> duplicati </a> </li> <li class=md-nav__item> <a href=../../images/docker-emby/ class=md-nav__link> emby </a> </li> <li class=md-nav__item> <a href=../../images/docker-embystat/ class=md-nav__link> embystat </a> </li> <li class=md-nav__item> <a href=../../images/docker-emulatorjs/ class=md-nav__link> emulatorjs </a> </li> <li class=md-nav__item> <a href=../../images/docker-endlessh/ class=md-nav__link> endlessh </a> </li> <li class=md-nav__item> <a href=../../images/docker-fail2ban/ class=md-nav__link> fail2ban </a> </li> <li class=md-nav__item> <a href=../../images/docker-feed2toot/ class=md-nav__link> feed2toot </a> </li> <li class=md-nav__item> <a href=../../images/docker-ffmpeg/ class=md-nav__link> ffmpeg </a> </li> <li class=md-nav__item> <a href=../../images/docker-filezilla/ class=md-nav__link> filezilla </a> </li> <li class=md-nav__item> <a href=../../images/docker-firefox/ class=md-nav__link> firefox </a> </li> <li class=md-nav__item> <a href=../../images/docker-fleet/ class=md-nav__link> fleet </a> </li> <li class=md-nav__item> <a href=../../images/docker-foldingathome/ class=md-nav__link> foldingathome </a> </li> <li class=md-nav__item> <a href=../../images/docker-freshrss/ class=md-nav__link> freshrss </a> </li> <li class=md-nav__item> <a href=../../images/docker-github-desktop/ class=md-nav__link> github-desktop </a> </li> <li class=md-nav__item> <a href=../../images/docker-gitqlient/ class=md-nav__link> gitqlient </a> </li> <li class=md-nav__item> <a href=../../images/docker-grav/ class=md-nav__link> grav </a> </li> <li class=md-nav__item> <a href=../../images/docker-grocy/ class=md-nav__link> grocy </a> </li> <li class=md-nav__item> <a href=../../images/docker-guacd/ class=md-nav__link> guacd </a> </li> <li class=md-nav__item> <a href=../../images/docker-habridge/ class=md-nav__link> habridge </a> </li> <li class=md-nav__item> <a href=../../images/docker-headphones/ class=md-nav__link> headphones </a> </li> <li class=md-nav__item> <a href=../../images/docker-healthchecks/ class=md-nav__link> healthchecks </a> </li> <li class=md-nav__item> <a href=../../images/docker-hedgedoc/ class=md-nav__link> hedgedoc </a> </li> <li class=md-nav__item> <a href=../../images/docker-heimdall/ class=md-nav__link> heimdall </a> </li> <li class=md-nav__item> <a href=../../images/docker-homeassistant/ class=md-nav__link> homeassistant </a> </li> <li class=md-nav__item> <a href=../../images/docker-htpcmanager/ class=md-nav__link> htpcmanager </a> </li> <li class=md-nav__item> <a href=../../images/docker-ipfs/ class=md-nav__link> ipfs </a> </li> <li class=md-nav__item> <a href=../../images/docker-jackett/ class=md-nav__link> jackett </a> </li> <li class=md-nav__item> <a href=../../images/docker-jellyfin/ class=md-nav__link> jellyfin </a> </li> <li class=md-nav__item> <a href=../../images/docker-kanzi/ class=md-nav__link> kanzi </a> </li> <li class=md-nav__item> <a href=../../images/docker-kasm/ class=md-nav__link> kasm </a> </li> <li class=md-nav__item> <a href=../../images/docker-kdenlive/ class=md-nav__link> kdenlive </a> </li> <li class=md-nav__item> <a href=../../images/docker-lazylibrarian/ class=md-nav__link> lazylibrarian </a> </li> <li class=md-nav__item> <a href=../../images/docker-ldap-auth/ class=md-nav__link> ldap-auth </a> </li> <li class=md-nav__item> <a href=../../images/docker-libreoffice/ class=md-nav__link> libreoffice </a> </li> <li class=md-nav__item> <a href=../../images/docker-libresonic/ class=md-nav__link> libresonic </a> </li> <li class=md-nav__item> <a href=../../images/docker-librespeed/ class=md-nav__link> librespeed </a> </li> <li class=md-nav__item> <a href=../../images/docker-lidarr/ class=md-nav__link> lidarr </a> </li> <li class=md-nav__item> <a href=../../images/docker-limnoria/ class=md-nav__link> limnoria </a> </li> <li class=md-nav__item> <a href=../../images/docker-lollypop/ class=md-nav__link> lollypop </a> </li> <li class=md-nav__item> <a href=../../images/docker-lychee/ class=md-nav__link> lychee </a> </li> <li class=md-nav__item> <a href=../../images/docker-mariadb/ class=md-nav__link> mariadb </a> </li> <li class=md-nav__item> <a href=../../images/docker-mastodon/ class=md-nav__link> mastodon </a> </li> <li class=md-nav__item> <a href=../../images/docker-medusa/ class=md-nav__link> medusa </a> </li> <li class=md-nav__item> <a href=../../images/docker-minetest/ class=md-nav__link> minetest </a> </li> <li class=md-nav__item> <a href=../../images/docker-minisatip/ class=md-nav__link> minisatip </a> </li> <li class=md-nav__item> <a href=../../images/docker-mstream/ class=md-nav__link> mstream </a> </li> <li class=md-nav__item> <a href=../../images/docker-mullvad-browser/ class=md-nav__link> mullvad-browser </a> </li> <li class=md-nav__item> <a href=../../images/docker-muximux/ class=md-nav__link> muximux </a> </li> <li class=md-nav__item> <a href=../../images/docker-mylar3/ class=md-nav__link> mylar3 </a> </li> <li class=md-nav__item> <a href=../../images/docker-mysql-workbench/ class=md-nav__link> mysql-workbench </a> </li> <li class=md-nav__item> <a href=../../images/docker-nano-discord-bot/ class=md-nav__link> nano-discord-bot </a> </li> <li class=md-nav__item> <a href=../../images/docker-nano-wallet/ class=md-nav__link> nano-wallet </a> </li> <li class=md-nav__item> <a href=../../images/docker-nano/ class=md-nav__link> nano </a> </li> <li class=md-nav__item> <a href=../../images/docker-netbootxyz/ class=md-nav__link> netbootxyz </a> </li> <li class=md-nav__item> <a href=../../images/docker-netbox/ class=md-nav__link> netbox </a> </li> <li class=md-nav__item> <a href=../../images/docker-nextcloud/ class=md-nav__link> nextcloud </a> </li> <li class=md-nav__item> <a href=../../images/docker-nginx/ class=md-nav__link> nginx </a> </li> <li class=md-nav__item> <a href=../../images/docker-ngircd/ class=md-nav__link> ngircd </a> </li> <li class=md-nav__item> <a href=../../images/docker-nntp2nntp/ class=md-nav__link> nntp2nntp </a> </li> <li class=md-nav__item> <a href=../../images/docker-nzbget/ class=md-nav__link> nzbget </a> </li> <li class=md-nav__item> <a href=../../images/docker-nzbhydra2/ class=md-nav__link> nzbhydra2 </a> </li> <li class=md-nav__item> <a href=../../images/docker-ombi/ class=md-nav__link> ombi </a> </li> <li class=md-nav__item> <a href=../../images/docker-openssh-server/ class=md-nav__link> openssh-server </a> </li> <li class=md-nav__item> <a href=../../images/docker-openvpn-as/ class=md-nav__link> openvpn-as </a> </li> <li class=md-nav__item> <a href=../../images/docker-openvscode-server/ class=md-nav__link> openvscode-server </a> </li> <li class=md-nav__item> <a href=../../images/docker-opera/ class=md-nav__link> opera </a> </li> <li class=md-nav__item> <a href=../../images/docker-organizr/ class=md-nav__link> organizr </a> </li> <li class=md-nav__item> <a href=../../images/docker-oscam/ class=md-nav__link> oscam </a> </li> <li class=md-nav__item> <a href=../../images/docker-overseerr/ class=md-nav__link> overseerr </a> </li> <li class=md-nav__item> <a href=../../images/docker-pairdrop/ class=md-nav__link> pairdrop </a> </li> <li class=md-nav__item> <a href=../../images/docker-paperless-ng/ class=md-nav__link> paperless-ng </a> </li> <li class=md-nav__item> <a href=../../images/docker-paperless-ngx/ class=md-nav__link> paperless-ngx </a> </li> <li class=md-nav__item> <a href=../../images/docker-papermerge/ class=md-nav__link> papermerge </a> </li> <li class=md-nav__item> <a href=../../images/docker-photoshow/ class=md-nav__link> photoshow </a> </li> <li class=md-nav__item> <a href=../../images/docker-phpmyadmin/ class=md-nav__link> phpmyadmin </a> </li> <li class=md-nav__item> <a href=../../images/docker-pidgin/ class=md-nav__link> pidgin </a> </li> <li class=md-nav__item> <a href=../../images/docker-piwigo/ class=md-nav__link> piwigo </a> </li> <li class=md-nav__item> <a href=../../images/docker-pixapop/ class=md-nav__link> pixapop </a> </li> <li class=md-nav__item> <a href=../../images/docker-plex-meta-manager/ class=md-nav__link> plex-meta-manager </a> </li> <li class=md-nav__item> <a href=../../images/docker-plex/ class=md-nav__link> plex </a> </li> <li class=md-nav__item> <a href=../../images/docker-projectsend/ class=md-nav__link> projectsend </a> </li> <li class=md-nav__item> <a href=../../images/docker-prowlarr/ class=md-nav__link> prowlarr </a> </li> <li class=md-nav__item> <a href=../../images/docker-pwndrop/ class=md-nav__link> pwndrop </a> </li> <li class=md-nav__item> <a href=../../images/docker-pydio-cells/ class=md-nav__link> pydio-cells </a> </li> <li class=md-nav__item> <a href=../../images/docker-pyload-ng/ class=md-nav__link> pyload-ng </a> </li> <li class=md-nav__item> <a href=../../images/docker-pyload/ class=md-nav__link> pyload </a> </li> <li class=md-nav__item> <a href=../../images/docker-pylon/ class=md-nav__link> pylon </a> </li> <li class=md-nav__item> <a href=../../images/docker-qbittorrent/ class=md-nav__link> qbittorrent </a> </li> <li class=md-nav__item> <a href=../../images/docker-qdirstat/ class=md-nav__link> qdirstat </a> </li> <li class=md-nav__item> <a href=../../images/docker-quassel-core/ class=md-nav__link> quassel-core </a> </li> <li class=md-nav__item> <a href=../../images/docker-quassel-web/ class=md-nav__link> quassel-web </a> </li> <li class=md-nav__item> <a href=../../images/docker-radarr/ class=md-nav__link> radarr </a> </li> <li class=md-nav__item> <a href=../../images/docker-raneto/ class=md-nav__link> raneto </a> </li> <li class=md-nav__item> <a href=../../images/docker-rdesktop/ class=md-nav__link> rdesktop </a> </li> <li class=md-nav__item> <a href=../../images/docker-readarr/ class=md-nav__link> readarr </a> </li> <li class=md-nav__item> <a href=../../images/docker-remmina/ class=md-nav__link> remmina </a> </li> <li class=md-nav__item> <a href=../../images/docker-requestrr/ class=md-nav__link> requestrr </a> </li> <li class=md-nav__item> <a href=../../images/docker-resilio-sync/ class=md-nav__link> resilio-sync </a> </li> <li class=md-nav__item> <a href=../../images/docker-rsnapshot/ class=md-nav__link> rsnapshot </a> </li> <li class=md-nav__item> <a href=../../images/docker-sabnzbd/ class=md-nav__link> sabnzbd </a> </li> <li class=md-nav__item> <a href=../../images/docker-scrutiny/ class=md-nav__link> scrutiny </a> </li> <li class=md-nav__item> <a href=../../images/docker-shout-irc/ class=md-nav__link> shout-irc </a> </li> <li class=md-nav__item> <a href=../../images/docker-sickchill/ class=md-nav__link> sickchill </a> </li> <li class=md-nav__item> <a href=../../images/docker-sickgear/ class=md-nav__link> sickgear </a> </li> <li class=md-nav__item> <a href=../../images/docker-smokeping/ class=md-nav__link> smokeping </a> </li> <li class=md-nav__item> <a href=../../images/docker-snapdrop/ class=md-nav__link> snapdrop </a> </li> <li class=md-nav__item> <a href=../../images/docker-snipe-it/ class=md-nav__link> snipe-it </a> </li> <li class=md-nav__item> <a href=../../images/docker-sonarr/ class=md-nav__link> sonarr </a> </li> <li class=md-nav__item> <a href=../../images/docker-sqlitebrowser/ class=md-nav__link> sqlitebrowser </a> </li> <li class=md-nav__item> <a href=../../images/docker-swag/ class=md-nav__link> swag </a> </li> <li class=md-nav__item> <a href=../../images/docker-synclounge/ class=md-nav__link> synclounge </a> </li> <li class=md-nav__item> <a href=../../images/docker-syncthing/ class=md-nav__link> syncthing </a> </li> <li class=md-nav__item> <a href=../../images/docker-syslog-ng/ class=md-nav__link> syslog-ng </a> </li> <li class=md-nav__item> <a href=../../images/docker-taisun/ class=md-nav__link> taisun </a> </li> <li class=md-nav__item> <a href=../../images/docker-tautulli/ class=md-nav__link> tautulli </a> </li> <li class=md-nav__item> <a href=../../images/docker-thelounge/ class=md-nav__link> thelounge </a> </li> <li class=md-nav__item> <a href=../../images/docker-transmission/ class=md-nav__link> transmission </a> </li> <li class=md-nav__item> <a href=../../images/docker-tvheadend/ class=md-nav__link> tvheadend </a> </li> <li class=md-nav__item> <a href=../../images/docker-ubooquity/ class=md-nav__link> ubooquity </a> </li> <li class=md-nav__item> <a href=../../images/docker-unifi-controller/ class=md-nav__link> unifi-controller </a> </li> <li class=md-nav__item> <a href=../../images/docker-vscodium/ class=md-nav__link> vscodium </a> </li> <li class=md-nav__item> <a href=../../images/docker-webcord/ class=md-nav__link> webcord </a> </li> <li class=md-nav__item> <a href=../../images/docker-webgrabplus/ class=md-nav__link> webgrabplus </a> </li> <li class=md-nav__item> <a href=../../images/docker-webtop/ class=md-nav__link> webtop </a> </li> <li class=md-nav__item> <a href=../../images/docker-wikijs/ class=md-nav__link> wikijs </a> </li> <li class=md-nav__item> <a href=../../images/docker-wireguard/ class=md-nav__link> wireguard </a> </li> <li class=md-nav__item> <a href=../../images/docker-wireshark/ class=md-nav__link> wireshark </a> </li> <li class=md-nav__item> <a href=../../images/docker-wps-office/ class=md-nav__link> wps-office </a> </li> <li class=md-nav__item> <a href=../../images/docker-xbackbone/ class=md-nav__link> xbackbone </a> </li> <li class=md-nav__item> <a href=../../images/docker-your_spotify/ class=md-nav__link> your_spotify </a> </li> <li class=md-nav__item> <a href=../../images/docker-yq/ class=md-nav__link> yq </a> </li> <li class=md-nav__item> <a href=../../images/docker-znc/ class=md-nav__link> znc </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_5> <label class=md-nav__link for=__nav_5 id=__nav_5_label tabindex=0> Misc <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_5_label aria-expanded=false> <label class=md-nav__title for=__nav_5> <span class="md-nav__icon md-icon"></span> Misc </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../misc/finances/ class=md-nav__link> Finances </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#intro class=md-nav__link> Intro </a> </li> <li class=md-nav__item> <a href=#installation class=md-nav__link> Installation </a> </li> <li class=md-nav__item> <a href=#single-service-usage class=md-nav__link> Single service Usage </a> </li> <li class=md-nav__item> <a href=#multiple-service-usage class=md-nav__link> Multiple Service Usage </a> </li> <li class=md-nav__item> <a href=#updates class=md-nav__link> Updates </a> </li> <li class=md-nav__item> <a href=#support-requests class=md-nav__link> Support Requests </a> </li> <li class=md-nav__item> <a href=#common-gotchas class=md-nav__link> Common Gotchas </a> <nav class=md-nav aria-label="Common Gotchas"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#quoting-variables class=md-nav__link> Quoting variables </a> </li> <li class=md-nav__item> <a href=#escaping-signs class=md-nav__link> Escaping $ signs </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#tips-tricks class=md-nav__link> Tips & Tricks </a> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <h1 id=docker-compose>Docker Compose</h1> <h2 id=intro>Intro</h2> <p>Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.</p> <p>Note that when inputting data for variables, you must follow standard YAML rules. In the case of passwords with special characters this can mean escaping them properly ($ is the escape character) or properly quoting the variable. The best course of action if you do not know how to do this or are unwilling to research, is to stick to alphanumeric characters only.</p> <h2 id=installation>Installation</h2> <ul> <li>Install Option 1 (recommended)</li> </ul> <p>Starting with version 2, Docker started publishing <code>docker compose</code> as a go based plugin for docker (rather than a python based standalone binary). And they also publish this plugin for various arches, including x86_64, armhf and aarch64 (as opposed to the x86_64 only binaries for v1.X). Therefore we updated our recommended install option to utilize the plugin.</p> <p>Install docker from the official repos as described <a href=https://docs.docker.com/engine/install/ >here</a> or via the convenient <a href=https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script>get-docker script</a> as described below:</p> <div class=highlight><pre><span></span><code>curl<span class=w> </span>-fsSL<span class=w> </span>https://get.docker.com<span class=w> </span>-o<span class=w> </span>get-docker.sh<span class=w> </span><span class=o>&&</span><span class=w> </span><span class=se>\</span>
|
||
sh<span class=w> </span>get-docker.sh
|
||
</code></pre></div> <ul> <li>Install Option 2 (manual)</li> </ul> <p>You can install <code>docker compose</code> manually via the following commands:</p> <div class=highlight><pre><span></span><code><span class=nv>ARCH</span><span class=o>=</span><span class=k>$(</span>uname<span class=w> </span>-m<span class=k>)</span><span class=w> </span><span class=o>&&</span><span class=w> </span><span class=o>[[</span><span class=w> </span><span class=s2>"</span><span class=si>${</span><span class=nv>ARCH</span><span class=si>}</span><span class=s2>"</span><span class=w> </span><span class=o>==</span><span class=w> </span><span class=s2>"armv7l"</span><span class=w> </span><span class=o>]]</span><span class=w> </span><span class=o>&&</span><span class=w> </span><span class=nv>ARCH</span><span class=o>=</span><span class=s2>"armv7"</span><span class=w> </span><span class=o>&&</span><span class=w> </span><span class=se>\</span>
|
||
sudo<span class=w> </span>mkdir<span class=w> </span>-p<span class=w> </span>/usr/local/lib/docker/cli-plugins<span class=w> </span><span class=o>&&</span><span class=w> </span><span class=se>\</span>
|
||
sudo<span class=w> </span>curl<span class=w> </span>-SL<span class=w> </span><span class=s2>"https://github.com/docker/compose/releases/latest/download/docker-compose-linux-</span><span class=si>${</span><span class=nv>ARCH</span><span class=si>}</span><span class=s2>"</span><span class=w> </span>-o<span class=w> </span>/usr/local/lib/docker/cli-plugins/docker-compose<span class=w> </span><span class=o>&&</span><span class=w> </span><span class=se>\</span>
|
||
sudo<span class=w> </span>chmod<span class=w> </span>+x<span class=w> </span>/usr/local/lib/docker/cli-plugins/docker-compose
|
||
</code></pre></div> <p>Assuming you already have docker (or at the very least docker-cli) installed, preferably from the official docker repos, running <code>docker compose version</code> should display the compose version.</p> <p>If you don't have docker installed yet, we recommend installing it via the following commands:</p> <div class=highlight><pre><span></span><code>curl<span class=w> </span>-fsSL<span class=w> </span>https://get.docker.com<span class=w> </span>-o<span class=w> </span>get-docker.sh
|
||
sh<span class=w> </span>get-docker.sh
|
||
</code></pre></div> <ul> <li> <p>v1.X compatibility</p> <p>As v2 runs as a plugin instead of a standalone binary, it is invoked by <code>docker compose args</code> instead of <code>docker-compose args</code>. There are also some slight differences in how the yaml is operated as well. To make migration easier, Docker released a replacement binary for <code>docker-compose</code> on x86_64 and aarch64 platforms. More info on that can be found at the <a href=https://github.com/docker/compose-switch>upstream repo</a>.</p> </li> <li> <p>Install Option 3 (docker)</p> </li> </ul> <p>You can install docker-compose using our <a href=https://github.com/linuxserver/docker-docker-compose>docker-compose image</a> via a run script. You can simply run the following commands on your system and you should have a functional install that you can call from anywhere as <code>docker-compose</code>:</p> <div class=highlight><pre><span></span><code>sudo<span class=w> </span>curl<span class=w> </span>-L<span class=w> </span>--fail<span class=w> </span>https://raw.githubusercontent.com/linuxserver/docker-docker-compose/v2/run.sh<span class=w> </span>-o<span class=w> </span>/usr/local/bin/docker-compose
|
||
sudo<span class=w> </span>chmod<span class=w> </span>+x<span class=w> </span>/usr/local/bin/docker-compose
|
||
</code></pre></div> <p>In order to update the local image, you can run the following commands:</p> <div class=highlight><pre><span></span><code>docker<span class=w> </span>pull<span class=w> </span>linuxserver/docker-compose:<span class=s2>"</span><span class=si>${</span><span class=nv>DOCKER_COMPOSE_IMAGE_TAG</span><span class=k>:-</span><span class=nv>v2</span><span class=si>}</span><span class=s2>"</span>
|
||
docker<span class=w> </span>image<span class=w> </span>prune<span class=w> </span>-f
|
||
</code></pre></div> <p>The above commands will use the v2 images (although invoked by<code>docker-compose</code> instead of <code>docker compose</code>). If you'd like to use v1 images, you can set an env var <code>DOCKER_COMPOSE_IMAGE_TAG=alpine</code>, <code>DOCKER_COMPOSE_IMAGE_TAG=ubuntu</code> in your respective <code>.profile</code>. Alternatively you can set that var to a versioned image tag like <code>v2-2.4.1-r1</code> or <code>version-alpine-1.27.4</code> to pin it to a specific docker-compose version.</p> <h2 id=single-service-usage>Single service Usage</h2> <p>Here's a basic example for deploying a Linuxserver container with docker compose:</p> <div class=highlight><pre><span></span><code><span class=nt>version</span><span class=p>:</span><span class=w> </span><span class=s>"2.1"</span>
|
||
<span class=nt>services</span><span class=p>:</span>
|
||
<span class=w> </span><span class=nt>heimdall</span><span class=p>:</span>
|
||
<span class=w> </span><span class=nt>image</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">linuxserver/heimdall</span>
|
||
<span class=w> </span><span class=nt>container_name</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">heimdall</span>
|
||
<span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">/home/user/appdata/heimdall:/config</span>
|
||
<span class=w> </span><span class=nt>environment</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PUID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PGID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">TZ=Europe/London</span>
|
||
<span class=w> </span><span class=nt>ports</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">80:80</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">443:443</span>
|
||
<span class=w> </span><span class=nt>restart</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">unless-stopped</span>
|
||
</code></pre></div> <p>If you save the above snippet in a file named <code>docker-compose.yml</code>, you can simply run <code>docker compose up -d</code> from within the same folder and the heimdall image will be automatically pulled, and a container will be created and started. <code>up</code> means bring the services up, and <code>-d</code> means do it in the background.</p> <p>If you want to do it from a different folder or if you named the yaml file differently, ie. <code>heimdall.yml</code>, then you can define it in the command with <code>-f</code>: <code>docker compose -f /path/to/heimdall.yml up -d</code></p> <p>To bring down the services, simply do <code>docker compose down</code> or <code>docker compose -f /path/to/heimdall.yml down</code> and all containers defined by the yml will be stopped and destroyed.</p> <h2 id=multiple-service-usage>Multiple Service Usage</h2> <p>You can have multiple services managed by a single compose yaml. Copy the contents below the <code>services:</code> line in any of our readme yaml samples into the same yaml file and the <code>docker compose up/down</code> commands will apply to all services at once.</p> <p>Let's say you have the following in a yaml file named <code>docker-compose.yml</code>:</p> <div class=highlight><pre><span></span><code><span class=nt>version</span><span class=p>:</span><span class=w> </span><span class=s>"2.1"</span>
|
||
<span class=nt>services</span><span class=p>:</span>
|
||
<span class=w> </span><span class=nt>heimdall</span><span class=p>:</span>
|
||
<span class=w> </span><span class=nt>image</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">linuxserver/heimdall</span>
|
||
<span class=w> </span><span class=nt>container_name</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">heimdall</span>
|
||
<span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">/home/user/appdata/heimdall:/config</span>
|
||
<span class=w> </span><span class=nt>environment</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PUID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PGID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">TZ=Europe/London</span>
|
||
<span class=w> </span><span class=nt>ports</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">80:80</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">443:443</span>
|
||
<span class=w> </span><span class=nt>restart</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">unless-stopped</span>
|
||
<span class=w> </span><span class=nt>nginx</span><span class=p>:</span>
|
||
<span class=w> </span><span class=nt>image</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">linuxserver/nginx</span>
|
||
<span class=w> </span><span class=nt>container_name</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">nginx</span>
|
||
<span class=w> </span><span class=nt>environment</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PUID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PGID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">TZ=Europe/London</span>
|
||
<span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">/home/user/appdata/nginx:/config</span>
|
||
<span class=w> </span><span class=nt>ports</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">81:80</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">444:443</span>
|
||
<span class=w> </span><span class=nt>restart</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">unless-stopped</span>
|
||
<span class=w> </span><span class=nt>mariadb</span><span class=p>:</span>
|
||
<span class=w> </span><span class=nt>image</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">linuxserver/mariadb</span>
|
||
<span class=w> </span><span class=nt>container_name</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">mariadb</span>
|
||
<span class=w> </span><span class=nt>environment</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PUID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">PGID=1000</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">MYSQL_ROOT_PASSWORD=ROOT_ACCESS_PASSWORD</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">TZ=Europe/London</span>
|
||
<span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">/home/user/appdata/mariadb:/config</span>
|
||
<span class=w> </span><span class=nt>ports</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">3306:3306</span>
|
||
<span class=w> </span><span class=nt>restart</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">unless-stopped</span>
|
||
</code></pre></div> <p>You now have 3 services defined in there: <code>heimdall</code>, <code>nginx</code> and <code>mariadb</code>. When you do a <code>docker compose up -d</code>, it will first download the images for all three if they don't exist (if they exist, they are not updated) and it will create all three containers and start them. <code>docker compose down</code> will bring all three services down and destroy the containers (persistent data will remain).</p> <h2 id=updates>Updates</h2> <p>If you want to update the images and recreate the containers with the same vars, it's extremely easy with docker-compose. First we tell it to update all images via <code>docker compose pull</code>. Then we issue <code>docker compose up -d</code> and it will automatically recreate the containers (as necessary) based on the updated images. If a container's image is already the latest and there was no update, it remains untouched.</p> <p>Similarly, if you edit the contents of the yaml file and re-issue <code>docker compose up -d</code>, only the containers affected by the changes to the yaml file will be recreated, others will be untouched.</p> <p>Defining the containers running on your server as code is a core tenet of a "Devops" approach to the world. Constructing elaborate <code>docker run</code> commands and then forgetting which variables you passed is a thing of the past when using <code>docker compose</code>.</p> <h2 id=support-requests>Support Requests</h2> <p>If you would like to request support, you can do so on <a href=https://discourse.linuxserver.io/ >our forum</a> or on <a href="https://discord.gg/YWrKVTn?target=_blank">our discord server</a>. When you do so, please provide all the necessary information like the server and platform info, docker container log and the compose yaml.</p> <p>If your compose yaml makes use of <code>.env</code>, please post an output of <code>docker compose convert</code> or <code>docker compose convert -f /path/to/compose.yml</code> for the entire yaml, or <code>docker compose convert <service name></code> for a single service, as it will automatically replace the environment variables with their actual values.</p> <h2 id=common-gotchas>Common Gotchas</h2> <h3 id=quoting-variables>Quoting variables</h3> <p>In compose yamls, the environment variables can be defined in a couple of different styles. For the style we use in our readme samples, wrapping the variables in quotes is not required unless the variables contain spaces. When it's necessary, you can wrap them in quotes as described below.</p> <ul> <li> <p>Style 1 (our readme recommended style): <div class=highlight><pre><span></span><code><span class=nt>environment</span><span class=p>:</span>
|
||
<span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class=s>'key=value'</span>
|
||
</code></pre></div> This method requires the entire line wrapped in quotes, including the key and the value.</p> </li> <li> <p>Style 2: <div class=highlight><pre><span></span><code><span class=nt>environment</span><span class=p>:</span>
|
||
<span class=w> </span><span class=nt>key</span><span class=p>:</span><span class=w> </span><span class=s>'value'</span>
|
||
</code></pre></div> With this method, you can wrap just the value in quotes.</p> </li> </ul> <h3 id=escaping-signs>Escaping $ signs</h3> <p>Docker compose interprets values that follow a <code>$</code> as a variable and it will <a href=https://docs.docker.com/compose/compose-file/12-interpolation/ >interpolate at runtime</a>. If your environment variables contain the <code>$</code> character as part of the value and it needs to be treated literally, you need to escape it with another <code>$</code> sign.</p> <p>For example, if you want the variable <code>key</code> to have the value <code>real$value</code> exactly, you need to set <code>- 'key=real$$value'</code> in the compose yaml.</p> <h2 id=tips-tricks>Tips & Tricks</h2> <p><code>docker compose</code> expects a <code>docker-compose.yml</code> file in the current directory and if one isn't present it will complain. In order to improve your quality of life we suggest the use of bash aliases. The file path for the aliases below assumes that the <code>docker-compose.yml</code> file is being kept in the folder <code>/opt</code>. If your compose file is kept somewhere else, like in a home directory, then the path will need to be changed.</p> <p>Create or open the file <code>~/.bash_aliases</code> and populate with the following content:</p> <div class=highlight><pre><span></span><code><span class=nb>alias</span><span class=w> </span><span class=nv>dcup</span><span class=o>=</span><span class=s1>'docker compose -f /opt/docker-compose.yml up -d'</span><span class=w> </span><span class=c1>#brings up all containers if one is not defined after dcup</span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dcdown</span><span class=o>=</span><span class=s1>'docker compose -f /opt/docker-compose.yml stop'</span><span class=w> </span><span class=c1>#brings down all containers if one is not defined after dcdown</span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dcpull</span><span class=o>=</span><span class=s1>'docker compose -f /opt/docker-compose.yml pull'</span><span class=w> </span><span class=c1>#pulls all new images is specified after dcpull</span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dclogs</span><span class=o>=</span><span class=s1>'docker compose -f /opt/docker-compose.yml logs -tf --tail="50" '</span><span class=w> </span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dtail</span><span class=o>=</span><span class=s1>'docker logs -tf --tail="50" "$@"'</span>
|
||
</code></pre></div> <p>If the <code>docker-compose.yml</code> file is in a home directory, the following can be put in the <code>~/.bash_aliases</code> file.</p> <div class=highlight><pre><span></span><code><span class=nb>alias</span><span class=w> </span><span class=nv>dcup</span><span class=o>=</span><span class=s1>'docker compose -f ~/docker-compose.yml up -d'</span><span class=w> </span><span class=c1>#brings up all containers if one is not defined after dcup</span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dcdown</span><span class=o>=</span><span class=s1>'docker compose -f ~/docker-compose.yml stop'</span><span class=w> </span><span class=c1>#brings down all containers if one is not defined after dcdown</span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dcpull</span><span class=o>=</span><span class=s1>'docker compose -f ~/docker-compose.yml pull'</span><span class=w> </span><span class=c1>#pulls all new images unless one is specified</span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dclogs</span><span class=o>=</span><span class=s1>'docker compose -f ~/docker-compose.yml logs -tf --tail="50" '</span>
|
||
<span class=nb>alias</span><span class=w> </span><span class=nv>dtail</span><span class=o>=</span><span class=s1>'docker logs -tf --tail="50" "$@"'</span>
|
||
</code></pre></div> <p>There are multiple ways to see the logs of your containers. In some instances, using <code>docker logs</code> is preferable to <code>docker compose logs</code>. By default <code>docker logs</code> will not run unless you define which service the logs are coming from. The <code>docker compose logs</code> will pull all of the logs for the services defined in the <code>docker-compose.yml</code> file.</p> <p>When asking for help, you should post your logs or be ready to provide logs if someone requests it. If you are running multiple containers in your <code>docker-compose.yml</code> file, it is not helpful to submit <strong>all</strong> of the logs. If you are experiencing issues with a single service, say Heimdall, then you would want to get your logs using <code>docker logs heimdall</code> or <code>docker compose logs heimdall</code>. The bash_alias for <code>dclogs</code> can be used if you define your service after you've typed the alias. Likewise, the bash_alias <code>detail</code> will not run without defining the service after it.</p> <p>Some distributions, like Ubuntu, already have the code snippet below in the <code>~/.bashrc</code> file. If it is not included, you'll need to add the following to your <code>~/.bashrc</code> file in order for the aliases file to be picked up:</p> <div class=highlight><pre><span></span><code><span class=k>if</span><span class=w> </span><span class=o>[</span><span class=w> </span>-f<span class=w> </span>~/.bash_aliases<span class=w> </span><span class=o>]</span><span class=p>;</span><span class=w> </span><span class=k>then</span>
|
||
<span class=w> </span>.<span class=w> </span>~/.bash_aliases
|
||
<span class=k>fi</span>
|
||
</code></pre></div> <p>Once configured, you can run <code>source ~/.bashrc</code> or log out and the log in again. Now you can type <code>dcpull</code> or <code>dcup</code> to manage your entire fleet of containers at once. It's like magic.</p> </article> </div> </div> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> <div class=md-copyright__highlight> Copyright © 2022 LinuxServer.io </div> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> <div class=md-social> <a href=https://github.com/linuxserver target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM277.3 415.7c-8.4 1.5-11.5-3.7-11.5-8 0-5.4.2-33 .2-55.3 0-15.6-5.2-25.5-11.3-30.7 37-4.1 76-9.2 76-73.1 0-18.2-6.5-27.3-17.1-39 1.7-4.3 7.4-22-1.7-45-13.9-4.3-45.7 17.9-45.7 17.9-13.2-3.7-27.5-5.6-41.6-5.6-14.1 0-28.4 1.9-41.6 5.6 0 0-31.8-22.2-45.7-17.9-9.1 22.9-3.5 40.6-1.7 45-10.6 11.7-15.6 20.8-15.6 39 0 63.6 37.3 69 74.3 73.1-4.8 4.3-9.1 11.7-10.6 22.3-9.5 4.3-33.8 11.7-48.3-13.9-9.1-15.8-25.5-17.1-25.5-17.1-16.2-.2-1.1 10.2-1.1 10.2 10.8 5 18.4 24.2 18.4 24.2 9.7 29.7 56.1 19.7 56.1 19.7 0 13.9.2 36.5.2 40.6 0 4.3-3 9.5-11.5 8-66-22.1-112.2-84.9-112.2-158.3 0-91.8 70.2-161.5 162-161.5S388 165.6 388 257.4c.1 73.4-44.7 136.3-110.7 158.3zm-98.1-61.1c-1.9.4-3.7-.4-3.9-1.7-.2-1.5 1.1-2.8 3-3.2 1.9-.2 3.7.6 3.9 1.9.3 1.3-1 2.6-3 3zm-9.5-.9c0 1.3-1.5 2.4-3.5 2.4-2.2.2-3.7-.9-3.7-2.4 0-1.3 1.5-2.4 3.5-2.4 1.9-.2 3.7.9 3.7 2.4zm-13.7-1.1c-.4 1.3-2.4 1.9-4.1 1.3-1.9-.4-3.2-1.9-2.8-3.2.4-1.3 2.4-1.9 4.1-1.5 2 .6 3.3 2.1 2.8 3.4zm-12.3-5.4c-.9 1.1-2.8.9-4.3-.6-1.5-1.3-1.9-3.2-.9-4.1.9-1.1 2.8-.9 4.3.6 1.3 1.3 1.8 3.3.9 4.1zm-9.1-9.1c-.9.6-2.6 0-3.7-1.5s-1.1-3.2 0-3.9c1.1-.9 2.8-.2 3.7 1.3 1.1 1.5 1.1 3.3 0 4.1zm-6.5-9.7c-.9.9-2.4.4-3.5-.6-1.1-1.3-1.3-2.8-.4-3.5.9-.9 2.4-.4 3.5.6 1.1 1.3 1.3 2.8.4 3.5zm-6.7-7.4c-.4.9-1.7 1.1-2.8.4-1.3-.6-1.9-1.7-1.5-2.6.4-.6 1.5-.9 2.8-.4 1.3.7 1.9 1.8 1.5 2.6z"/></svg> </a> <a href=https://gitlab.com/linuxserver.io target=_blank rel=noopener title=gitlab.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M48 32h352c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48zm334.1 192.9-44.6-116.4c-.9-2.3-2.6-4.3-4.6-5.6-1.6-1-3.4-1.6-5.2-1.8-1.8-.2-3.7.1-5.4.7-1.7.7-3.3 1.7-4.5 3.1-1.2 1.4-2.1 3-2.6 4.8L285 201.9H162.1l-29.2-92.2c-.5-1.8-1.5-3.4-2.7-4.8-2.1-1.3-2.8-2.4-4.5-3-2.6-.7-3.6-1.8-5.4-.8-1.8.2-3.6.8-5.2 1.8-2 1.3-3.6 3.3-4.5 5.6L65.94 224.9l-.47 1.2a82.94 82.94 0 0 0-2.25 52.5c4.96 17.3 15.4 32.5 29.75 43.3l.17.1.38.3 67.88 50.9 54.2 40.9c1.5 1 5.3 2.8 8.3 2.8 3 0 6-1.8 8.4-2.8l54.1-40.9 68.4-51.2.2-.1c14.4-10.9 24.8-26.1 29.8-43.3 4.9-17.3 3.3-35.7-2.3-52.5l-.4-1.2z"/></svg> </a> <a href=https://twitter.com/linuxserverio target=_blank rel=noopener title=twitter.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-48.9 158.8c.2 2.8.2 5.7.2 8.5 0 86.7-66 186.6-186.6 186.6-37.2 0-71.7-10.8-100.7-29.4 5.3.6 10.4.8 15.8.8 30.7 0 58.9-10.4 81.4-28-28.8-.6-53-19.5-61.3-45.5 10.1 1.5 19.2 1.5 29.6-1.2-30-6.1-52.5-32.5-52.5-64.4v-.8c8.7 4.9 18.9 7.9 29.6 8.3a65.447 65.447 0 0 1-29.2-54.6c0-12.2 3.2-23.4 8.9-33.1 32.3 39.8 80.8 65.8 135.2 68.6-9.3-44.5 24-80.6 64-80.6 18.9 0 35.9 7.9 47.9 20.7 14.8-2.8 29-8.3 41.6-15.8-4.9 15.2-15.2 28-28.8 36.1 13.2-1.4 26-5.1 37.8-10.2-8.9 13.1-20.1 24.7-32.9 34z"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../..", "features": ["navigation.instant"], "search": "../../assets/javascripts/workers/search.208ed371.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src=../../assets/javascripts/bundle.51198bba.min.js></script> </body> </html> |