From 4259f7929aff5ca8e665e04d468329a7ac13673e Mon Sep 17 00:00:00 2001 From: Yibo Cai Date: Tue, 3 Jul 2018 10:48:09 +0800 Subject: jjb/releng: fix partial image name matching Docker image building script opnfv-docker.sh tries to remove existing images before and after building. It simply uses grep to matching image names, which may cause partial name matching problems. Ex. opnfv/compass-tasks will match both opnfv/compass-tasks and opnfv/compass-tasks-base, and may lead to accidentally removing of images still in use when several building tasks run concurrently. Error log: https://build.opnfv.org/ci/job/compass-tasks-build-arm64-master/6/console Change-Id: I1a83f801c5e0cc889cd9e17b8d1b4d895f1f68a9 Signed-off-by: Yibo Cai --- jjb/releng/opnfv-docker.sh | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/jjb/releng/opnfv-docker.sh b/jjb/releng/opnfv-docker.sh index 70baf16d9..e64764128 100644 --- a/jjb/releng/opnfv-docker.sh +++ b/jjb/releng/opnfv-docker.sh @@ -20,12 +20,20 @@ echo function remove_containers_images() { # Remove previous running containers if exist - if [[ -n "$(docker ps -a | grep $DOCKER_REPO_NAME)" ]]; then + # + # $ docker ps -a + # CONTAINER ID IMAGE COMMAND ... + # 6a796ed40b8e opnfv/compass-tasks:latest "/bin/bash" ... + # 99fcb59f4787 opnfv/compass-tasks-base:latest "/bin/bash" ... + # cc5eee16b995 opnfv/compass-tasks-k8s "/bin/bash" ... + # + # Cut image name by leading space and ending space or colon(tag) + if [[ -n "$(docker ps -a | grep " $DOCKER_REPO_NAME[ :]")" ]]; then echo "Removing existing $DOCKER_REPO_NAME containers..." - docker ps -a | grep $DOCKER_REPO_NAME | awk '{print $1}' | xargs docker rm -f + docker ps -a | grep " $DOCKER_REPO_NAME[ :]" | awk '{print $1}' | xargs docker rm -f t=60 # Wait max 60 sec for containers to be removed - while [[ $t -gt 0 ]] && [[ -n "$(docker ps| grep $DOCKER_REPO_NAME)" ]]; do + while [[ $t -gt 0 ]] && [[ -n "$(docker ps| grep " $DOCKER_REPO_NAME[ :]")" ]]; do sleep 1 let t=t-1 done @@ -33,12 +41,20 @@ function remove_containers_images() # Remove existing images if exist - if [[ -n "$(docker images | grep $DOCKER_REPO_NAME)" ]]; then + # + # $ docker images + # REPOSITORY TAG IMAGE ID ... + # opnfv/compass-tasks latest 6501569fd328 ... + # opnfv/compass-tasks-base latest 8764fe29c434 ... + # opnfv/compass-tasks-k8s latest 61094cac9e65 ... + # + # Cut image name by start of line and ending space + if [[ -n "$(docker images | grep "^$DOCKER_REPO_NAME ")" ]]; then echo "Docker images to remove:" - docker images | head -1 && docker images | grep $DOCKER_REPO_NAME - image_ids=($(docker images | grep $DOCKER_REPO_NAME | awk '{print $3}')) + docker images | head -1 && docker images | grep "^$DOCKER_REPO_NAME " + image_ids=($(docker images | grep "^$DOCKER_REPO_NAME " | awk '{print $3}')) for id in "${image_ids[@]}"; do - if [[ -n "$(docker images|grep $DOCKER_REPO_NAME|grep $id)" ]]; then + if [[ -n "$(docker images|grep "^$DOCKER_REPO_NAME "|grep $id)" ]]; then echo "Removing docker image $DOCKER_REPO_NAME:$id..." docker rmi -f $id fi -- cgit 1.2.3-korg