From 9b822d0b3e06167c69ee620fd469534c765eb483 Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Wed, 28 Nov 2018 10:31:12 +0100 Subject: [PATCH] fix: docker base image was wrong in image building charms having more than one layer. --- bin/compose-core | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/bin/compose-core b/bin/compose-core index 9e51ce1..f500bae 100755 --- a/bin/compose-core +++ b/bin/compose-core @@ -1098,22 +1098,31 @@ service_base_docker_image() { } service_image=$(echo "$service_def" | shyaml get-value image 2>/dev/null) if [ "$?" != 0 ]; then - service_build=$(echo "$service_def" | shyaml get-value build 2>/dev/null) - if [ "$?" != 0 ]; then - err "Service $DARKYELLOW$service$NORMAL has no ${WHITE}image${NORMAL} nor ${WHITE}build${NORMAL} parameter." - echo "$service_def" >&2 - return 1 - fi - service_dockerfile="${service_build}"/Dockerfile - if ! [ -e "$service_dockerfile" ]; then - err "No Dockerfile found in '$service_dockerfile' location." - return 1 - fi + ## According to https://stackoverflow.com/questions/32230577 , if there's a build, + ## then the builded image will get name ${project}_${service} + project=$(get_default_project_name) || return 1 + image_name="${project}_${service}" + if ! docker_has_image "$image_name"; then + service_build=$(echo "$service_def" | shyaml get-value build 2>/dev/null) + if [ "$?" != 0 ]; then + err "Service $DARKYELLOW$service$NORMAL has no ${WHITE}image${NORMAL} nor ${WHITE}build${NORMAL} parameter." + echo "$service_def" >&2 + return 1 + fi - grep '^FROM' "$service_dockerfile" | xargs printf "%s " | cut -f 2 -d " " + docker build "$service_build" -t "${project}_${service}" >&2 || { + err "Failed to build image for ${DARKYELLOW}$service${NORMAL}." + return 1 + } + fi + printf "%s" "${project}_${service}" else - echo "$service_image" + printf "%s" "${service_image}" fi | tee "$cache_file" + if [ "${PIPESTATUS[0]}" != 0 ]; then + rm "$cache_file" + return 1 + fi } export -f service_base_docker_image