- Shell 98.8%
- Dockerfile 1.2%
| .github/workflows | ||
| tests | ||
| .dockerignore | ||
| .editorconfig | ||
| .env.example | ||
| .shellcheckrc | ||
| compose.yaml | ||
| container-updater.sh | ||
| Dockerfile | ||
| README.md | ||
| Zabbix-Template_App-Maj.yml | ||
container-updater
Script Bash pour détecter et appliquer des mises à jour de workloads Docker via labels (monitor, docker-compose, Portainer), avec notifications Discord et métriques Zabbix optionnelles.
Nouveautés
- Script durci:
set -Eeuo pipefail, quoting strict, gestion d'erreurs centralisée. - Logs structurés (
textoujson) et mode--dry-run. - Intégration
.envstandard (.env.examplefourni). - Dockerfile moderne avec
HEALTHCHECK. compose.yamlexemple (Docker Compose v2).- CI GitHub Actions: lint shell, build image, scans Trivy.
Prérequis
bashdocker(daemon accessible)jqcurlzabbix_sender(uniquement si Zabbix est activé)
Usage local
chmod +x ./container-updater.sh
./container-updater.sh --help
Exemple:
./container-updater.sh \
-d "$DISCORD_WEBHOOK" \
-z "$ZABBIX_SERVER" \
-n "prod-host" \
--no-system-update
Variables d'environnement
Copier le modèle:
cp .env.example .env
Variables principales:
DISCORD_WEBHOOK: webhook Discord.ZABBIX_SERVER: serveur Zabbix.ZABBIX_HOST: nom d'hôte envoyé à Zabbix.GHCR_USERNAME,GHCR_TOKEN: auth GHCR (images privées).DOCKERHUB_USERNAME,DOCKERHUB_TOKEN: auth Docker Hub (évite les limites anonymes).UPDATE_SYSTEM_PACKAGES:true|false(apt/dnf).BLACKLIST: liste CSV de paquets.DRY_RUN:true|false.LOG_FORMAT:text|json.
Mode d'exécution (auto-détection)
Le script détecte automatiquement son mode:
standalone: scan des conteneurs locaux viadocker ps(comportement historique).swarm-manager: scan des services viadocker service ls.swarm-worker: aucune mise à jour Swarm, warning explicite puis sortie en succès.docker-unavailable: skip des vérifications Docker.
En mode swarm-manager, seul le flux Swarm est exécuté (pas de double scan docker ps).
Labels supportés (standalone + swarm)
En Swarm, les labels sont lus avec cette priorité:
Spec.Labels(labels de servicedeploy.labels)Spec.TaskTemplate.ContainerSpec.Labels(fallback)
Monitoring uniquement
labels:
- "autoupdate=monitor"
Mise à jour automatique via Docker Compose
labels:
- "autoupdate=true"
- "autoupdate.docker-compose=/path/to/compose.yaml"
Note Swarm: autoupdate.docker-compose est ignoré volontairement (warning dans les logs).
Raison: docker compose up n'est pas un mécanisme sûr pour mettre à jour un service Swarm.
Mise à jour automatique via webhook Portainer
labels:
- "autoupdate=true"
- "autoupdate.webhook=https://..."
Méthode par défaut en Swarm (sans webhook)
Si autoupdate=true et qu'aucun webhook n'est défini, le script applique:
docker service update --image <repo:tag> --detach=false <service>
Avec GHCR_TOKEN configuré, --with-registry-auth est ajouté automatiquement.
Exemple labels Swarm au niveau service (deploy.labels)
services:
app:
image: example/app:latest
deploy:
labels:
- "autoupdate=true"
- "autoupdate.webhook=https://..."
Exemple fallback labels dans TaskTemplate.ContainerSpec.Labels
services:
app:
image: example/app:latest
labels:
- "autoupdate=true"
Exécution en conteneur (Compose v2)
docker compose up -d --build
compose.yaml monte /var/run/docker.sock pour piloter le daemon hôte.
CI/CD
Workflow: .github/workflows/ci.yml
- Shell lint:
shellcheck,shfmt - Build Docker:
docker/build-push-action - Scan sécurité: Trivy (filesystem + image)
Healthcheck
./container-updater.sh --healthcheck
Zabbix template
Template fourni: Zabbix-Template_App-Maj.yml