docker-compose "restart" bash script
-
Hallo, ich wollte mal fragen, ob das so geht:
#!/bin/bash cd ./folder1/ || exit docker-compose down if [[ -n "$1" ]] && [[ "${1#*.}" == "prune" ]]; then docker system prune -a -f docker system df fi docker-compose pull docker-compose up --build -d
In
folder1
ist dasdocker-compose.yml
und das sieht ungefähr so aus:version: '3.8' volumes: volume_1: volume_2: volume_3: #... services: app1: image: '...' restart: unless-stopped environment: - IRGENDWAS=true volumes: - volume_1:/data app2: image: ... restart: unless-stopped command: IRGENDWAS2 links: - app1 volumes: - volume_2:/var/lib/xyz env_file: - ./envsfiles/app2.env app3: build: ./dockerfiles restart: unless-stopped links: - app2 volumes: - volume_3:/var/www/html env_file: - ./envsfiles/app3.env #...
docker-compose soll gestoppt werden, dann soll ggf. alles aufgeräumt werden, dann sollen alle Images aktualisiert bzw. gebaut werden, und schließlich soll docker-compose wieder gestartet werden.
Die Volumes sollen dabei nicht aufgeräumt werden, also, das wäre blöd.
Macht man das so oder denke ich zu kompliziert?
-
docker compose down --rmi all && docker compose up --build --pull -d
fertig.einige anmerkungen warum dein script mist ist:
docker-compose
ist das alte python tool, das neue command heisstdocker compose
- dein if-block ist unnoetig, denn du solltest niemals dangling images oder container rumliegen haben, stattdessen einfach
--rmi all
fuer das entsprechende compose-file aufrufen, dann passiert das nicht pull
und dannbuild
macht nicht viel sinn, das laesst orphans und dependency images zurueck, also wenn du base images haben willst, und darauf was aufbauen willst, entwederup --build --pull
oderbuild --pull
und danach den ganzen krams starten.
zugegebener massen ist das ganze command handling in docker nen ziemlicher clusterfuck, denn es gibt gefuehlt 40 commands die den selben namen haben, aber andere sachen machen
und dann hast du noch 4 verschiedene moeglichkeiten das selbe zu machen, aber mit verschiedenen commands....in der theory kannst du das command noch verkuerzen, zu
docker compose down --rmi all && docker compose up --build -d
(--pull
switch removed fromup
command) wenn du deinen services im compose file ne pull_policy verpasst.
-
@Cardiac sagte in docker-compose "restart" bash script:
docker compose up --build --pull -d fertig
Nö, funktioniert nicht.
Glaubst du, es hatte für Script-Zeile 8 keinen Grund?
Edit: zumindest funktioniert, so glaube ich,
up --build --pull -d
mitdocker-compose
nicht...
-
@Cardiac sagte in docker-compose "restart" bash script:
in der theory kannst du das command noch verkuerzen, zu docker compose down --rmi all && docker compose up --build -d (--pull switch removed from up command) wenn du deinen services im compose file ne pull_policy verpasst.
Ok, danke.
-
$ docker compose docker: 'compose' is not a docker command. See 'docker --help'
-
@Fragender sagte in docker-compose "restart" bash script:
Glaubst du, es hatte für Script-Zeile 8 keinen Grund?
glauben brauche ich es nicht, denn ich weiss es besser.
@Fragender sagte in docker-compose "restart" bash script:
Edit: zumindest funktioniert, so glaube ich, up --build --pull -d mit docker-compose nicht...
du hast recht, da fehlt die pull option
--pull always|missing|never
ref@Fragender sagte in docker-compose "restart" bash script:
$ docker compose docker: 'compose' is not a docker command. See 'docker --help'
https://docs.docker.com/compose/install/linux/#install-using-the-repository ?
-
@Cardiac Ja, das war das Problem, ich hatte anstatt
docker-compose-plugin
nurdocker-compose
installiert ... Jetzt muss ich mir überlegen, wie ich das am besten rückgängig machen kann, also wieder deinstalliere. Danke für den Hinweis.@Cardiac sagte in docker-compose "restart" bash script:
docker compose down --rmi all && docker compose up --build --pull -d
Was genau würde
--rmi all
bewirken? Und was hast du gegendocker system prune -a -f
einzuwenden?
-
@Fragender sagte in docker-compose "restart" bash script:
Was genau würde --rmi all bewirken?
RTFM, ich habe extra die docs gelinkt, die sind nicht schlecht.
@Fragender sagte in docker-compose "restart" bash script:
Und was hast du gegen docker system prune -a -f einzuwenden?
du willst deine compose projects einzeln handlen. alles was du in dein script jagst, sollte genau nur anfassesn, was es anfassen soll. In diesem fall dieses eine compose.
docker system
kennt diesen scope nicht. das operiert auf - festhalten - system ebene. Wenn du zwei, drei compose projects auf dem host laufen hast, und eines davon ist beispielsweise grade down, und du jagst da nensystem prune -a -f
drueber, dann ist das weg.du kannst system prune mal manuell durchlaufen lassen, um das system in nen clean state zu bekommen, aber danach sollte jedes compose project seinen eigenen krams wegraeumen, und etwaige one-shot container ebenfalls (aka
docker run --rm
)
-
Ich habe mein docker compose restart bash script jetzt noch einmal angepasst. Denn es macht ja keinen Sinn,
system prune
schon vor der Aktualisierung aufzurufen, das erzeugte ja unnötige Daten ...#!/bin/bash cd ./folder1/ || exit docker compose down docker compose pull docker compose up --build -d if [[ -n "$1" ]] && [[ "${1#*.}" == "prune" ]]; then docker system prune -a -f docker system df fi
Passt das so?
-
@Cardiac sagte in docker-compose "restart" bash script:
pull und dann build macht nicht viel sinn, das laesst orphans und dependency images zurueck, also wenn du base images haben willst, und darauf was aufbauen willst, entweder up --build --pull oder build --pull und danach den ganzen krams starten.
@Cardiac man muss auf die Reihenfolge achten,
#!/bin/bash docker compose down docker compose up --pull --build --detach if [[ -n "$1" ]] && [[ "${1#*.}" == "prune" ]]; then docker system prune -a -f docker system df fi
(also
docker compose up --pull --build --detach
) funktioniert ...Danke dafür, das Thema ist nun gelöst.
-
Guten Morgen & schönen 1. Advent!
Ich habe ein Aktualisierungsskript, das jeden Morgen einmal läuft. Heute Morgen bekam ich jedoch folgende Fehlermeldung:
Die gute Nachricht ist, der Server läuft inzwischen nach einem Neustart wieder.
Die schlechte Nachricht ist, ich muss mich jetzt auf die Fehlersuche begeben, damit es evtl. nicht noch einmal passiert.
Die "--remove-orphans"-Option hatte nichts bewirkt.
Die letzte Fehlermeldung, nach "docker compose down", war:
Network proxy_default Removing Network proxy_default Error failed to remove network proxy_default: Error response from daemon: error while removing network: network proxy_default id <id...> has active endpoints
Und "docker ps" gab eine leere Liste aus.
Woran hat das wohl gelegen und welche log-Dateien kann ich mir ansehen?
-
Glaube, ich habs...
Zu der docker-compose.yml wurde ein Service hinzugefügt und noch einmal "docker compose up -d" aufgerufen, ohne dass vorher "docker compose down" aufgerufen wurde. Das mag docker bzw. der Proxy nicht, egal, ob ein Service hinzugefügt oder entfernt wird.
... Was mich aber noch wundert ist, dass das Aktualisierungsskript bereits zweimal (ohne Neustart) ohne Probleme durchlief. Daher ist das nur eine Vermutung...
Auf jeden Fall scheint etwas mit dem docker systemd deamon service nicht gestimmt zu haben.
-
Kann euch auch gerne einen Teil des Skripts zeigen:
#!/bin/sh set -e #... cd $spath docker compose down # To go sure, docker is down and file operations are complete sleep 5 sudo sh -c "apt update && DEBIAN_FRONTEND=noninteractive apt upgrade -y && apt autoremove -y && apt autoclean" # To go sure, upgrades are done sleep 5 docker compose pull docker compose build --pull docker compose up -d # To go sure, docker is running again sleep 5 docker system prune -a -f # Just for information purposes, everything is up sleep 5 docker system df docker stats --no-stream | sort -k 2 if [ -f /var/run/reboot-required ] then #... do some magic fi
Der Fehler trat direkt in Zeile 5 auf, bei der letzten compose down Anweisung, network removing...
Die deamon logs ("sudo journalctl -xu docker.service") waren, im Vergleich zum Vortag, unauffällig.