From 52c3d7a690be0a4e4a0fd43e8068be5d9924aeb9 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 18 Sep 2019 00:13:22 +0400 Subject: [PATCH] dk: ps, ls et rm prennent des filtres. ajout de pull --- dk | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 177 insertions(+), 11 deletions(-) diff --git a/dk b/dk index 9053958..26823ae 100755 --- a/dk +++ b/dk @@ -88,12 +88,50 @@ COMMANDES systemd|systemd-unit Générer une unité systemd qui démarre les services. A priori, ce n'est nécessaire que si aucune politique de redémarrage n'a été définie. - ps + ps [filter|name=value] Afficher les containers en cours d'exécution - ls + Le filtre est une expression régulière de type awk qui est mise en + correspondace avec les noms de l'image et de la tâche. + Il est aussi possible d'utiliser un filtre docker de la forme name=value + - ancestor=([:tag]|| ) + containers created from an image or a descendant. + - before=(|) + - expose=([/]|/[]) + - exited= an exit code of + - health=(starting|healthy|unhealthy|none) + - id= a container's ID + - is-task=(true|false) + - label= or label== + - name= a container's name + - network=(|) + - publish=([/]|/[]) + - since=(|) + - status=(created|restarting|removing|running|paused|exited) + - volume=(|) + ls [filter|name=value] Lister les images actuellement présentes - rm - Supprimer une image + Le filtre est une expression régulière de type awk qui est mise en + correspondance avec le nom de l'image. Un suffixe :tag permet de ne + sélectionner que les images correspondant au filtre qui ont le tag + spécifié. + Il est aussi possible d'utiliser un filtre docker de la forme name=value + - dangling=(true|false) - find unused images + - label= or label== + - before=([:tag]|| ) + - since=([:tag]|| ) + - reference=(pattern of an image reference) + pull filter + Mettre à jour une ou plusieurs images + Le filtre est une expression régulière de type awk qui est mise en + correspondance avec le nom de l'image. Un suffixe :tag permet de ne + sélectionner que les images correspondant au filtre qui ont le tag + spécifié. + rm filter + Supprimer une ou plusieurs images + Le filtre est une expression régulière de type awk qui est mise en + correspondance avec le nom de l'image. Un suffixe :tag permet de ne + sélectionner que les images correspondant au filtre qui ont le tag + spécifié. X|prune Supprimer les containers et les images inutilisées @@ -196,6 +234,8 @@ FONCTIONS de update-apps.conf automatiquement, sauf si une valeur NOFIX est spécifiée." } +function echo_lines() { local IFS=$'\n'; echo "$*"; } + function get_version() { local GIT_DIR; unset GIT_DIR if git rev-parse --git-dir >/dev/null 2>&1; then @@ -1359,14 +1399,140 @@ while [ $# -gt 0 ]; do enote "Profil $PROFILE" auto_systemd_unit "${args[@]}" || die ;; - ps) docker container ps -a || die;; - ls) docker image ls || die;; + ps) + pscmd=( + docker container ps -a + --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Status}}\t{{.RunningFor}}\t{{.Ports}}\t{{.Command}}" + ) + filtercmd=(cat) + awkscript=' +NR == 1 { print; next } +($2 ~ filter || $3 ~ filter) { print } +' + if [ $# -eq 0 ]; then + # pas de filtre + : + elif [ "$1" == -- ]; then + # fin de la commande + shift + elif [[ "$1" == *=* ]]; then + # filtre docker + pscmd+=(--filter "$1") + shift + else + # expression régulière + filtercmd=(awk -v filter="$1" "$awkscript") + shift + fi + set -o pipefail + "${pscmd[@]}" | "${filtercmd[@]}" || die + ;; + ls) + lscmd=(docker image ls) + filtercmd=(cat) + awkscript=' +BEGIN { + if (split(filter, parts, /:/) > 1) { + filter = parts[1] + tag = parts[2] + } else { + tag = "" + } +} +NR == 1 { print; next } +(filter == "" || $1 ~ filter) && (tag == "" || $2 ~ tag) { print } +' + if [ $# -eq 0 ]; then + # pas de filtre + : + elif [ "$1" == -- ]; then + # fin de la commande + shift + elif [[ "$1" == *=* ]]; then + # filtre docker + lscmd+=(--filter "$1") + shift + else + # expression régulière + filtercmd=(awk -v filter="$1" "$awkscript") + shift + fi + set -o pipefail + "${lscmd[@]}" | "${filtercmd[@]}" || die + ;; + pull) + lscmd=(docker image ls) + filtercmd=(awk 'NR == 1 { print; next } $2 !~ / 1) { + filter = parts[1] + tag = parts[2] + } else { + tag = "" + } +} +NR == 1 { print; next } +(filter == "" || $1 ~ filter) && (tag == "" || $2 ~ tag) && $2 !~ / 1) { + filter = parts[1] + tag = parts[2] + } else { + tag = "" + } +} +NR == 1 { print; next } +(filter == "" || $1 ~ filter) && (tag == "" || $2 ~ tag) { print } +' + if [ $# -eq 0 -o "$1" == -- ]; then + # pas de filtre + ewarn "rm: Vous devez spécifier l'image à supprimer" + continue + elif [[ "$1" == *=* ]]; then + # filtre docker + lscmd+=(--filter "$1") + shift + else + # expression régulière + filtercmd=(awk -v filter="$1" "$awkscript") + shift + fi + all="$("${lscmd[@]}" | "${filtercmd[@]}")" + setx -a images awk 'NR == 1 { next } { print $3 }' <<<"$all" + if [ ${#images[*]} -gt 0 ]; then + echo "$all" + ask_yesno "Etes-vous sûr de vouloir supprimer ces images?" || die + docker image rm "${images[@]}" || die + fi ;; X|prune) docker container prune -f || die