How do y’all manage all these Docker compose apps?
First I installed Jellyfin natively on Debian, which was nice because everything just worked with the normal package manager and systemd.
Then, Navidrome wasn’t in the repos, but it’s a simple Go binary and provides a systemd unit file, so that was not so bad just downloading a new binary every now and then.
Then… Immich came… and forced me to use Docker compose… :|
Now I’m looking at Frigate… and it also requires Docker compose… :|
Looking through the docs, looks like Jellyfin, Navidrome, Immich, and Frigate all require/support Docker compose…
At this point, I’m wondering if I should switch everything to Docker compose so I can keep everything straight.
But, how do folks manage this mess? Is there an analogue to apt update
, apt upgrade
, systemctl restart
, journalctl
for all these Docker compose apps? Or do I have to individually manage each app? I guess I could write a bash script… but… is this what other people do?
I have 5
docker-compose
-based services. I wrote a shell script:#!/usr/bin/env bash for y in $(find /etc/ -name docker-compose.yml); do cd $(dirname $y) docker compose pull systemctl resteart $y done
For loops with find are evil for a lot of reasons, one of which is spaces:
$ tree . ├── arent good with find loops │ ├── a │ └── innerdira │ └── docker-compose.yml └── dirs with spaces ├── b └── innerdirb └── docker-compose.yml 3 directories, 2 files $ for y in $(find .); do echo $y; done . ./are t good with fi d loops ./are t good with fi d loops/i erdira ./are t good with fi d loops/i erdira/docker-compose.yml ./are t good with fi d loops/a ./dirs with spaces ./dirs with spaces/i erdirb ./dirs with spaces/i erdirb/docker-compose.yml ./dirs with spaces/b
You can kinda fix that with IFS (this breaks if newlines are in the filename which would probably only happen in a malicious context):
$ OIFS=$IFS $ IFS=$'\n' $ for y in $(find .); do echo "$y"; done . ./arent good with find loops ./arent good with find loops/innerdira ./arent good with find loops/innerdira/docker-compose.yml ./arent good with find loops/a ./dirs with spaces ./dirs with spaces/innerdirb ./dirs with spaces/innerdirb/docker-compose.yml ./dirs with spaces/b $ IFS=$OIFS
But you can also use something like:
find . -name 'docker-compose.yml' -printf '%h\0' | while read -r -d $'\0' dir; do .... done
or in your case this could all be done from
find
alone:find . -name 'docker-compose.yml' -execdir ...
-execdir
in this case is basically replacing yourcd $(dirname $y)
, which is also brittle when it comes to spaces and should be quoted:cd "$(dirname "$y")"
.I hope the real version doesn’t have the spelling problem!