docker-documentation/general/docker-compose/index.html

79 wiersze
93 KiB
HTML
Czysty Zwykły widok Historia

<!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=../../assets/favicon.ico><meta name=generator content="mkdocs-1.5.3, mkdocs-material-9.5.13"><title>Docker Compose - LinuxServer.io</title><link rel=stylesheet href=../../assets/stylesheets/main.7e359304.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.06af60db.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> <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 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=../../assets/icon.svg 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_0> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69Z"/></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_1> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12c0-2.42-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69Z"/></svg> </label> </form> <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-co
</span><span id=__span-0-2><a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a>curl<span class=w> </span>-sL<span class=w> </span><span class=s2>&quot;https://github.com/docker/compose/releases/latest/download/docker-compose-</span><span class=k>$(</span>uname<span class=w> </span>-s<span class=k>)</span><span class=s2>-</span><span class=k>$(</span>uname<span class=w> </span>-m<span class=k>)</span><span class=s2>&quot;</span><span class=w> </span>-o<span class=w> </span><span class=s2>&quot;</span><span class=nv>$HOME</span><span class=s2>/.docker/cli-plugins/docker-compose&quot;</span><span class=w> </span><span class=o>&amp;&amp;</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-0-3><a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a>chmod<span class=w> </span>+x<span class=w> </span><span class=nv>$HOME</span>/.docker/cli-plugins/docker-compose
</span></code></pre></div> <p>If you prefer to install it system-wide you can use <code>/usr/local/lib/docker/cli-plugins</code> instead of <code>$HOME/.docker/cli-plugins</code></p> <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> <h4 id=v1x-compatibility>v1.x compatibility<a class=headerlink href=#v1x-compatibility title="Permanent link">&para;</a></h4> <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>. 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> <h2 id=single-service-usage>Single service Usage<a class=headerlink href=#single-service-usage title="Permanent link">&para;</a></h2> <p>Here's a basic example for deploying a Linuxserver container with docker compose:</p> <div class="language-yaml highlight"><pre><span></span><code><span id=__span-1-1><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=nt>version</span><span class=p>:</span><span class=w> </span><span class=s>&quot;2.1&quot;</span>
</span><span id=__span-1-2><a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a><span class=nt>services</span><span class=p>:</span>
</span><span id=__span-1-3><a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a><span class=w> </span><span class=nt>heimdall</span><span class=p>:</span>
</span><span id=__span-1-4><a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a><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><span id=__span-1-5><a id=__codelineno-1-5 name=__codelineno-1-5 href=#__codelineno-1-5></a><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><span id=__span-1-6><a id=__codelineno-1-6 name=__codelineno-1-6 href=#__codelineno-1-6></a><span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
</span><span id=__span-1-7><a id=__codelineno-1-7 name=__codelineno-1-7 href=#__codelineno-1-7></a><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><span id=__span-1-8><a id=__codelineno-1-8 name=__codelineno-1-8 href=#__codelineno-1-8></a><span class=w> </span><span class=nt>environment</span><span class=p>:</span>
</span><span id=__span-1-9><a id=__codelineno-1-9 name=__codelineno-1-9 href=#__codelineno-1-9></a><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><span id=__span-1-10><a id=__codelineno-1-10 name=__codelineno-1-10 href=#__codelineno-1-10></a><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><span id=__span-1-11><a id=__codelineno-1-11 name=__codelineno-1-11 href=#__codelineno-1-11></a><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><span id=__span-1-12><a id=__codelineno-1-12 name=__codelineno-1-12 href=#__codelineno-1-12></a><span class=w> </span><span class=nt>ports</span><span class=p>:</span>
</span><span id=__span-1-13><a id=__codelineno-1-13 name=__codelineno-1-13 href=#__codelineno-1-13></a><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><span id=__span-1-14><a id=__codelineno-1-14 name=__codelineno-1-14 href=#__codelineno-1-14></a><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><span id=__span-1-15><a id=__codelineno-1-15 name=__codelineno-1-15 href=#__codelineno-1-15></a><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></code></pre></div> <p>If you save the above snippet in a file named <code>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<a class=headerlink href=#multiple-service-usage title="Permanent link">&para;</a></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>compose.yml</code>:</p> <div class="language-yaml highlight"><pre><span></span><code><span id=__span-2-1><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=nt>version</span><span class=p>:</span><span class=w> </span><span class=s>&quot;2.1&quot;</span>
</span><span id=__span-2-2><a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a><span class=nt>services</span><span class=p>:</span>
</span><span id=__span-2-3><a id=__codelineno-2-3 name=__codelineno-2-3 href=#__codelineno-2-3></a><span class=w> </span><span class=nt>heimdall</span><span class=p>:</span>
</span><span id=__span-2-4><a id=__codelineno-2-4 name=__codelineno-2-4 href=#__codelineno-2-4></a><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><span id=__span-2-5><a id=__codelineno-2-5 name=__codelineno-2-5 href=#__codelineno-2-5></a><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><span id=__span-2-6><a id=__codelineno-2-6 name=__codelineno-2-6 href=#__codelineno-2-6></a><span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
</span><span id=__span-2-7><a id=__codelineno-2-7 name=__codelineno-2-7 href=#__codelineno-2-7></a><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><span id=__span-2-8><a id=__codelineno-2-8 name=__codelineno-2-8 href=#__codelineno-2-8></a><span class=w> </span><span class=nt>environment</span><span class=p>:</span>
</span><span id=__span-2-9><a id=__codelineno-2-9 name=__codelineno-2-9 href=#__codelineno-2-9></a><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><span id=__span-2-10><a id=__codelineno-2-10 name=__codelineno-2-10 href=#__codelineno-2-10></a><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><span id=__span-2-11><a id=__codelineno-2-11 name=__codelineno-2-11 href=#__codelineno-2-11></a><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><span id=__span-2-12><a id=__codelineno-2-12 name=__codelineno-2-12 href=#__codelineno-2-12></a><span class=w> </span><span class=nt>ports</span><span class=p>:</span>
</span><span id=__span-2-13><a id=__codelineno-2-13 name=__codelineno-2-13 href=#__codelineno-2-13></a><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><span id=__span-2-14><a id=__codelineno-2-14 name=__codelineno-2-14 href=#__codelineno-2-14></a><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><span id=__span-2-15><a id=__codelineno-2-15 name=__codelineno-2-15 href=#__codelineno-2-15></a><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><span id=__span-2-16><a id=__codelineno-2-16 name=__codelineno-2-16 href=#__codelineno-2-16></a>
</span><span id=__span-2-17><a id=__codelineno-2-17 name=__codelineno-2-17 href=#__codelineno-2-17></a><span class=w> </span><span class=nt>nginx</span><span class=p>:</span>
</span><span id=__span-2-18><a id=__codelineno-2-18 name=__codelineno-2-18 href=#__codelineno-2-18></a><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><span id=__span-2-19><a id=__codelineno-2-19 name=__codelineno-2-19 href=#__codelineno-2-19></a><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><span id=__span-2-20><a id=__codelineno-2-20 name=__codelineno-2-20 href=#__codelineno-2-20></a><span class=w> </span><span class=nt>environment</span><span class=p>:</span>
</span><span id=__span-2-21><a id=__codelineno-2-21 name=__codelineno-2-21 href=#__codelineno-2-21></a><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><span id=__span-2-22><a id=__codelineno-2-22 name=__codelineno-2-22 href=#__codelineno-2-22></a><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><span id=__span-2-23><a id=__codelineno-2-23 name=__codelineno-2-23 href=#__codelineno-2-23></a><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><span id=__span-2-24><a id=__codelineno-2-24 name=__codelineno-2-24 href=#__codelineno-2-24></a><span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
</span><span id=__span-2-25><a id=__codelineno-2-25 name=__codelineno-2-25 href=#__codelineno-2-25></a><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><span id=__span-2-26><a id=__codelineno-2-26 name=__codelineno-2-26 href=#__codelineno-2-26></a><span class=w> </span><span class=nt>ports</span><span class=p>:</span>
</span><span id=__span-2-27><a id=__codelineno-2-27 name=__codelineno-2-27 href=#__codelineno-2-27></a><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><span id=__span-2-28><a id=__codelineno-2-28 name=__codelineno-2-28 href=#__codelineno-2-28></a><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><span id=__span-2-29><a id=__codelineno-2-29 name=__codelineno-2-29 href=#__codelineno-2-29></a><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><span id=__span-2-30><a id=__codelineno-2-30 name=__codelineno-2-30 href=#__codelineno-2-30></a>
</span><span id=__span-2-31><a id=__codelineno-2-31 name=__codelineno-2-31 href=#__codelineno-2-31></a><span class=w> </span><span class=nt>mariadb</span><span class=p>:</span>
</span><span id=__span-2-32><a id=__codelineno-2-32 name=__codelineno-2-32 href=#__codelineno-2-32></a><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><span id=__span-2-33><a id=__codelineno-2-33 name=__codelineno-2-33 href=#__codelineno-2-33></a><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><span id=__span-2-34><a id=__codelineno-2-34 name=__codelineno-2-34 href=#__codelineno-2-34></a><span class=w> </span><span class=nt>environment</span><span class=p>:</span>
</span><span id=__span-2-35><a id=__codelineno-2-35 name=__codelineno-2-35 href=#__codelineno-2-35></a><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><span id=__span-2-36><a id=__codelineno-2-36 name=__codelineno-2-36 href=#__codelineno-2-36></a><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><span id=__span-2-37><a id=__codelineno-2-37 name=__codelineno-2-37 href=#__codelineno-2-37></a><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><span id=__span-2-38><a id=__codelineno-2-38 name=__codelineno-2-38 href=#__codelineno-2-38></a><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><span id=__span-2-39><a id=__codelineno-2-39 name=__codelineno-2-39 href=#__codelineno-2-39></a><span class=w> </span><span class=nt>volumes</span><span class=p>:</span>
</span><span id=__span-2-40><a id=__codelineno-2-40 name=__codelineno-2-40 href=#__codelineno-2-40></a><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><span id=__span-2-41><a id=__codelineno-2-41 name=__codelineno-2-41 href=#__codelineno-2-41></a><span class=w> </span><span class=nt>ports</span><span class=p>:</span>
</span><span id=__span-2-42><a id=__codelineno-2-42 name=__codelineno-2-42 href=#__codelineno-2-42></a><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><span id=__span-2-43><a id=__codelineno-2-43 name=__codelineno-2-43 href=#__codelineno-2-43></a><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></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<a class=headerlink href=#updates title="Permanent link">&para;</a></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<a class=headerlink href=#support-requests title="Permanent link">&para;</a></h2> <p>If you would like to request support, you can do so on <a href=https://discord.gg/linuxserver>our discord server</a> or <a href=https://discourse.linuxserver.io/ >our forum</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 .env files, please post an output of <code>docker compose config</code> or <code>docker compose config -f /path/to/compose.yml</code> for the entire yaml, or <code>docker compose config &lt;service name&gt;</code> for a single service, as it will automatically replace the environment variables with their actual values.</p> <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>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>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> <h2 id=common-gotchas>Common Gotchas<a class=headerlink href=#common-gotchas title="Permanent link">&para;</a></h2> <h3 id=quoting-variables>Quoting variables<a class=headerlink href=#quoting-variables title="Permanent link">&para;</a></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>Style 1 (our readme recommended style):</li> </ul> <div class="language-yaml highlight"><pre><span></span><code><span id=__span-3-1><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__
</span><span id=__span-3-2><a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a><span class=w> </span><span class="p p-Indicator">-</span><span class=w> </span><span class=s>&#39;key=value&#39;</span>
</span></code></pre></div> <p>This method requires the entire line wrapped in quotes, including the key and the value.</p> <ul> <li>Style 2:</li> </ul> <div class="language-yaml highlight"><pre><span></span><code><span id=__span-4-1><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a><span class=nt>environment</span><span class=p>:</span>
</span><span id=__span-4-2><a id=__codelineno-4-2 name=__codelineno-4-2 href=#__codelineno-4-2></a><span class=w> </span><span class=nt>key</span><span class=p>:</span><span class=w> </span><span class=s>&#39;value&#39;</span>
</span></code></pre></div> <p>With this method, you can wrap just the value in quotes.</p> <h3 id=escaping-signs>Escaping $ signs<a class=headerlink href=#escaping-signs title="Permanent link">&para;</a></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 &amp; Tricks<a class=headerlink href=#tips-tricks title="Permanent link">&para;</a></h2> <p><code>docker compose</code> expects a <code>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>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="language-shell highlight"><pre><span></span><code><span id=__span-5-1><a id=__codelineno-5-1 name=__codelineno-5-1 href=#__codelineno-5-1></a><span class=nb>alias</span><span class=w> </span><span class=nv>dcup</span><span class=o>=</span><span class=s1>&#39;docker compose -f /opt/compose.yml up -d&#39;</span><span class=w> </span><span class=c1>#brings up all containers if one is not defined after dcup</span>
</span><span id=__span-5-2><a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a><span class=nb>alias</span><span class=w> </span><span class=nv>dcdown</span><span class=o>=</span><span class=s1>&#39;docker compose -f /opt/compose.yml stop&#39;</span><span class=w> </span><span class=c1>#brings down all containers if one is not defined after dcdown</span>
</span><span id=__span-5-3><a id=__codelineno-5-3 name=__codelineno-5-3 href=#__codelineno-5-3></a><span class=nb>alias</span><span class=w> </span><span class=nv>dcpull</span><span class=o>=</span><span class=s1>&#39;docker compose -f /opt/compose.yml pull&#39;</span><span class=w> </span><span class=c1>#pulls all new images is specified after dcpull</span>
</span><span id=__span-5-4><a id=__codelineno-5-4 name=__codelineno-5-4 href=#__codelineno-5-4></a><span class=nb>alias</span><span class=w> </span><span class=nv>dclogs</span><span class=o>=</span><span class=s1>&#39;docker compose -f /opt/compose.yml logs -tf --tail=&quot;50&quot; &#39;</span>
</span><span id=__span-5-5><a id=__codelineno-5-5 name=__codelineno-5-5 href=#__codelineno-5-5></a><span class=nb>alias</span><span class=w> </span><span class=nv>dtail</span><span class=o>=</span><span class=s1>&#39;docker logs -tf --tail=&quot;50&quot; &quot;$@&quot;&#39;</span>
</span></code></pre></div> <p>If the <code>compose.yml</code> file is in a home directory, the following can be put in the <code>~/.bash_aliases</code> file.</p> <div class="language-shell highlight"><pre><span></span><code><span id=__span-6-1><a id=__codelineno-6-1 name=__codelineno-6-1 href=#__codelineno-6-1></a><span class=nb>alias</span><span class=w> </span><span class=nv>dcup</span><span class=o>=</span><span class=s1>&#39;docker compose -f ~/compose.yml up -d&#39;</span><span class=w> </span><span class=c1>#brings up all containers if one is not defined after dcup</span>
</span><span id=__span-6-2><a id=__codelineno-6-2 name=__codelineno-6-2 href=#__codelineno-6-2></a><span class=nb>alias</span><span class=w> </span><span class=nv>dcdown</span><span class=o>=</span><span class=s1>&#39;docker compose -f ~/compose.yml stop&#39;</span><span class=w> </span><span class=c1>#brings down all containers if one is not defined after dcdown</span>
</span><span id=__span-6-3><a id=__codelineno-6-3 name=__codelineno-6-3 href=#__codelineno-6-3></a><span class=nb>alias</span><span class=w> </span><span class=nv>dcpull</span><span class=o>=</span><span class=s1>&#39;docker compose -f ~/compose.yml pull&#39;</span><span class=w> </span><span class=c1>#pulls all new images unless one is specified</span>
</span><span id=__span-6-4><a id=__codelineno-6-4 name=__codelineno-6-4 href=#__codelineno-6-4></a><span class=nb>alias</span><span class=w> </span><span class=nv>dclogs</span><span class=o>=</span><span class=s1>&#39;docker compose -f ~/compose.yml logs -tf --tail=&quot;50&quot; &#39;</span>
</span><span id=__span-6-5><a id=__codelineno-6-5 name=__codelineno-6-5 href=#__codelineno-6-5></a><span class=nb>alias</span><span class=w> </span><span class=nv>dtail</span><span class=o>=</span><span class=s1>&#39;docker logs -tf --tail=&quot;50&quot; &quot;$@&quot;&#39;</span>
</span></code></pre></div> <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="language-shell highlight"><pre><span></span><code><span id=__span-7-1><a id=__codelineno-7-1 name=__codelineno-7-1 href=#__codelineno-7-1></a><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><span id=__span-7-2><a id=__codelineno-7-2 name=__codelineno-7-2 href=#__codelineno-7-2></a><span class=w> </span>.<span class=w> </span>~/.bash_aliases
</span><span id=__span-7-3><a id=__codelineno-7-3 name=__codelineno-7-3 href=#__codelineno-7-3></a><span class=k>fi</span>
</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> <aside class=md-source-file> <span class=md-source-file__fact> <span class=md-icon title="Last update"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1-2.1-2M12.5 7v5.2l4 2.4-1 1L11 13V7h1.5M11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2v1.8Z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">November 9, 2023</span> </span> <span class=md-source-file__fact> <span class=md-icon title=Created> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M14.47 15.08 11 13V7h1.5v5.25l3.08 1.83c-.41.28-.79.62-1.11 1m-1.39 4.84c-.36.05-.71.08-1.08.08-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8c0 .37-.03.72-.08 1.08.69.1 1.33.32 1.92.64.1-.56.16-1.13.16-1.72 0-5.5-4.5-10-10-10S2 6.5 2 12s4.47 10 10 10c.59 0 1.16-.06 1.72-.16-.32-.59-.54-1.23-.64-1.92M18 15v3h-3v2h3v3h2v-3h3v-2h-3v-3h-2Z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">January 24, 2019</span> </span> </aside> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg> Back to top </button> </main> <footer class=md-footer> <nav class="md-footer__inner md-grid" aria-label=Footer> <a href=../container-customization/ class="md-footer__link md-footer__link--prev" aria-label="Previous: Customizing LinuxServer Containers"> <div class="md-footer__button md-icon"> <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> </div> <div class=md-footer__title> <span class=md-footer__direction> Previous </span> <div class=md-ellipsis> Customizing LinuxServer Containers </div> </div> </a> <a href=../understanding-puid-and-pgid/ class="md-footer__link md-footer__link--next" aria-label="Next: Understanding PUID and PGID"> <div class=md-footer__title> <span class=md-footer__direction> Next </span> <div class=md-ellipsis> Understanding PUID and PGID </div> </div> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg> </div> </a> </nav> <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 &copy; 2024 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://linuxserver.io target=_blank rel=noopener title=linuxserver.io class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 640 512"><!-- Font Awesome Free 6.5.1 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="m181.5 197.1 12.9 6.4c5.9 3 12.4 4.5 19.1 4.5 23.5 0 42.6-19.1 42.6-42.6V144c0-35.3-28.7-64-64-64H128c-35.3 0-64 28.7-64 64v21.4c0 23.5 19.1 42.6 42.6 42.6 6.6 0 13.1-1.5 19.1-4.5l12.9-6.4 8.4-4.2-11.9-7.9c-4.5-3-7.1-8-7.1-13.3V168c0-13.3 10.7-24 24-24h16c13.3 0 24 10.7 24 24v3.7c0 5.3-2.7 10.3-7.1 13.3l-11.8 7.9 8.4 4.2zm-8.6 49.4L160 240l-12.9 6.4c-12.6 6.3-26.5 9.6-40.5 9.6-3.6 0-7.1-.2-10.6-.6v.6c0 35.3 28.7