From ec82414987b80490ca75d4bbb4a294361d3817a5 Mon Sep 17 00:00:00 2001 From: pika Date: Sun, 13 Apr 2025 09:55:12 +0200 Subject: [PATCH] addet new docker update function --- .zsh/themes | 1 + .zshrc | 43 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) create mode 160000 .zsh/themes diff --git a/.zsh/themes b/.zsh/themes new file mode 160000 index 0000000..9a6accb --- /dev/null +++ b/.zsh/themes @@ -0,0 +1 @@ +Subproject commit 9a6accbb320abd6eeafe391cf68abc99ed726ec2 diff --git a/.zshrc b/.zshrc index 6055c7b..3d3ffbf 100644 --- a/.zshrc +++ b/.zshrc @@ -174,14 +174,49 @@ __docker__() { alias dl="docker compose logs -f" alias dc="docker compose" check_for_updates() { + # Check for required dependencies + if ! command -v jq &>/dev/null; then + echo -e "${RED}Error: jq is required but not installed. Please install jq.${NC}" + return 1 + fi + + if ! docker compose version &>/dev/null; then + echo -e "${RED}Error: docker compose is not available.${NC}" + return 1 + fi + local updated=false - local images=$(docker compose config | grep 'image:' | awk '{print $2}') + local images + images=$(docker compose config --format json | jq -r '.services[] | .image' 2>/dev/null) + + if [[ -z "$images" ]]; then + echo -e "${RED}Error: No Docker images found in the compose configuration.${NC}" + return 1 + fi for image in $images; do echo -e "${CYAN}Checking for updates for image: ${YELLOW}$image${NC}" - local local_digest=$(docker image inspect "$image" --format '{{index .RepoDigests 0}}' 2>/dev/null) - local remote_digest=$(docker pull --quiet --dry-run "$image" 2>/dev/null | grep 'Digest:' | awk '{print $2}') + # Get local image digest + local local_digest + local_digest=$(docker image inspect "$image" --format '{{index .RepoDigests 0}}' 2>/dev/null) + + if [[ -z "$local_digest" ]]; then + echo -e "${YELLOW}Image not present or digest unavailable. Update needed.${NC}" + updated=true + continue + fi + + # Get remote image digest using manifest inspect + local remote_digest + remote_digest=$(DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect -v "$image" 2>/dev/null | jq -r '.Descriptor.digest' 2>/dev/null) + + if [[ -z "$remote_digest" ]]; then + echo -e "${RED}Failed to retrieve remote digest. Skipping.${NC}" + continue + fi + + # Compare digests if [[ "$local_digest" != "$remote_digest" ]]; then echo -e "${GREEN}Update available for $image${NC}" updated=true @@ -192,7 +227,7 @@ __docker__() { if $updated; then echo -e "${CYAN}Pulling updates and recreating containers...${NC}" - docker compose pull && docker compose up -d --force-recreate + docker compose pull --quiet && docker compose up -d --force-recreate else echo -e "${GREEN}All images are up to date. No action needed.${NC}" fi