From 785d9b49377743c078d97cd2964600ccc5d8f389 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 29 May 2019 00:08:02 -0400 Subject: [PATCH 1/2] feat: allow setting DOCKER_BIN path for docker execution This change allows operators to specify a DOCKER_BIN environment variable. This will specify a binary to run when executing docker, which is useful in cases where the 'docker' command being run must be modified in a way that would otherwise be invasive to Dokku, but minimalistic if done within a wrapper. --- dokku | 5 ++ plugins/00_dokku-standard/subcommands/report | 6 +- plugins/app-json/internal-functions | 6 +- plugins/apps/post-delete | 2 +- plugins/apps/pre-delete | 2 +- plugins/apps/subcommands/clone | 2 +- plugins/apps/subcommands/rename | 2 +- plugins/build-env/pre-build-buildpack | 12 ++-- plugins/common/common.go | 16 ++++- plugins/common/functions | 66 +++++++++---------- plugins/enter/subcommands/default | 2 +- plugins/network/network.go | 2 +- plugins/ps/internal-functions | 2 +- plugins/ps/subcommands/default | 2 +- .../subcommands/purge-cache/purge-cache.go | 4 +- plugins/scheduler-docker-local/check-deploy | 8 +-- .../scheduler-docker-local/core-post-deploy | 10 +-- .../scheduler-docker-local/internal-functions | 12 ++-- plugins/scheduler-docker-local/post-delete | 6 +- plugins/scheduler-docker-local/pre-deploy | 2 +- plugins/scheduler-docker-local/pre-restore | 2 +- .../scheduler-docker-local/scheduler-deploy | 22 +++---- .../scheduler-docker-cleanup | 6 +- .../scheduler-docker-local/scheduler-inspect | 2 +- plugins/scheduler-docker-local/scheduler-logs | 4 +- .../scheduler-logs-failed | 4 +- .../scheduler-docker-local/scheduler-retire | 6 +- plugins/scheduler-docker-local/scheduler-run | 2 +- plugins/scheduler-docker-local/scheduler-stop | 6 +- .../scheduler-tags-create | 2 +- .../scheduler-tags-destroy | 2 +- plugins/tags/subcommands/default | 2 +- tests/unit/40_report.bats | 32 +++++++++ 33 files changed, 155 insertions(+), 106 deletions(-) diff --git a/dokku b/dokku index 6d90d7d72..09b64ecf1 100755 --- a/dokku +++ b/dokku @@ -2,6 +2,7 @@ set -eo pipefail shopt -s nullglob +export DOCKER_BIN=docker if [[ -r /etc/default/dokku ]]; then # shellcheck disable=SC1091 source /etc/default/dokku @@ -36,6 +37,10 @@ DOKKU_DISTRO=$( echo "$ID" ) +# Specify twice so that only host-level +# configuration can ever override the DOCKER_BIN value +export DOCKER_BIN=${DOCKER_BIN:="docker"} + export DOKKU_IMAGE=${DOKKU_IMAGE:="gliderlabs/herokuish:latest"} export DOKKU_LIB_ROOT=${DOKKU_LIB_PATH:="/var/lib/dokku"} diff --git a/plugins/00_dokku-standard/subcommands/report b/plugins/00_dokku-standard/subcommands/report index 0fb8923ab..b148c56d0 100755 --- a/plugins/00_dokku-standard/subcommands/report +++ b/plugins/00_dokku-standard/subcommands/report @@ -12,12 +12,12 @@ dokku_report_cmd() { dokku_log_info1 "memory: " free -m | sed "s/^/ /" dokku_log_info1 "docker version: " - docker version | sed "s/^/ /" + "$DOCKER_BIN" version | sed "s/^/ /" dokku_log_info1 "docker daemon info: " - docker -D info | sed "s/^/ /" + "$DOCKER_BIN" -D info | sed "s/^/ /" dokku_log_info1 "sigil version: $(sigil -v)" dokku_log_info1 "herokuish version: " - docker run --rm "$DOKKU_IMAGE" herokuish version | sed "s/^/ /" + "$DOCKER_BIN" run --rm "$DOKKU_IMAGE" herokuish version | sed "s/^/ /" dokku_log_info1 "dokku version: $(dokku version)" dokku_log_info1 "dokku plugins: " dokku plugin:list | sed "s/^/ /" diff --git a/plugins/app-json/internal-functions b/plugins/app-json/internal-functions index 72cee342c..8fbbc6558 100755 --- a/plugins/app-json/internal-functions +++ b/plugins/app-json/internal-functions @@ -96,8 +96,8 @@ execute_script() { DOKKU_APP_SHELL="$(config_get "$APP" DOKKU_APP_SHELL || echo "$DOKKU_APP_SHELL")" [[ -z "$DOKKU_APP_SHELL" ]] && DOKKU_APP_SHELL="/bin/bash" - id=$(docker run "$DOKKU_GLOBAL_RUN_ARGS" -e DOKKU_TRACE="$DOKKU_TRACE" --label=dokku_phase_script="${PHASE_SCRIPT_KEY}" -d -v "$CACHE_HOST_DIR:/cache" "${ARG_ARRAY[@]}" "$IMAGE" "$DOKKU_APP_SHELL" -c "$COMMAND") - if test "$(docker wait "$id")" -ne 0; then + id=$("$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" -e DOKKU_TRACE="$DOKKU_TRACE" --label=dokku_phase_script="${PHASE_SCRIPT_KEY}" -d -v "$CACHE_HOST_DIR:/cache" "${ARG_ARRAY[@]}" "$IMAGE" "$DOKKU_APP_SHELL" -c "$COMMAND") + if test "$("$DOCKER_BIN" wait "$id")" -ne 0; then dokku_container_log_verbose_quiet "$id" dokku_log_fail "execution of '$SCRIPT_CMD' failed!" fi @@ -120,5 +120,5 @@ execute_script() { fi # shellcheck disable=SC2086 - eval docker commit $DOCKER_COMMIT_ARGS "$id" "$IMAGE" >/dev/null + eval "$DOCKER_BIN" commit $DOCKER_COMMIT_ARGS "$id" "$IMAGE" >/dev/null } diff --git a/plugins/apps/post-delete b/plugins/apps/post-delete index a5cb2aab3..8efe6e80d 100755 --- a/plugins/apps/post-delete +++ b/plugins/apps/post-delete @@ -16,7 +16,7 @@ app_post_delete() { fi # shellcheck disable=SC2046 - docker rmi $(docker images -q "$IMAGE_REPO" | xargs) &>/dev/null || true + "$DOCKER_BIN" rmi $("$DOCKER_BIN" images -q "$IMAGE_REPO" | xargs) &>/dev/null || true } app_post_delete "$@" diff --git a/plugins/apps/pre-delete b/plugins/apps/pre-delete index 92742e2e8..92a2ae159 100755 --- a/plugins/apps/pre-delete +++ b/plugins/apps/pre-delete @@ -18,7 +18,7 @@ apps_pre_delete() { fi if [[ -d $CACHE_DIR ]]; then - docker run "$DOKKU_GLOBAL_RUN_ARGS" --rm -v "$CACHE_HOST_DIR:/cache" "$IMAGE" find /cache -depth -mindepth 1 -maxdepth 1 -exec rm -Rf {} \; || true + "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" --rm -v "$CACHE_HOST_DIR:/cache" "$IMAGE" find /cache -depth -mindepth 1 -maxdepth 1 -exec rm -Rf {} \; || true fi } diff --git a/plugins/apps/subcommands/clone b/plugins/apps/subcommands/clone index d911f55f9..fe6ce5387 100755 --- a/plugins/apps/subcommands/clone +++ b/plugins/apps/subcommands/clone @@ -44,7 +44,7 @@ apps_clone_cmd() { plugn trigger post-app-clone-setup "$OLD_APP" "$NEW_APP" if [[ -d "$NEW_CACHE_DIR" ]] && ! rmdir "$NEW_CACHE_DIR"; then - docker run "$DOKKU_GLOBAL_RUN_ARGS" --rm -v "$NEW_CACHE_HOST_DIR:/cache" "dokku/$OLD_APP" chmod 777 -R /cache + "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" --rm -v "$NEW_CACHE_HOST_DIR:/cache" "dokku/$OLD_APP" chmod 777 -R /cache fi rm -rf "$NEW_CACHE_DIR" diff --git a/plugins/apps/subcommands/rename b/plugins/apps/subcommands/rename index 5f5f2e051..fcbdb88a6 100755 --- a/plugins/apps/subcommands/rename +++ b/plugins/apps/subcommands/rename @@ -16,7 +16,7 @@ apps_rename_cmd() { local OLD_CACHE_HOST_DIR="$DOKKU_HOST_ROOT/$OLD_APP/cache" if [[ -d "$OLD_CACHE_DIR" ]] && ! rmdir "$OLD_CACHE_DIR" >/dev/null 2>&1; then - docker run "$DOKKU_GLOBAL_RUN_ARGS" --rm -v "$OLD_CACHE_HOST_DIR:/cache" "dokku/$OLD_APP" chmod 777 -R /cache + "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" --rm -v "$OLD_CACHE_HOST_DIR:/cache" "dokku/$OLD_APP" chmod 777 -R /cache fi rm -rf "$OLD_CACHE_DIR" apps_create "$NEW_APP" diff --git a/plugins/build-env/pre-build-buildpack b/plugins/build-env/pre-build-buildpack index 022e8f74d..05f182163 100755 --- a/plugins/build-env/pre-build-buildpack +++ b/plugins/build-env/pre-build-buildpack @@ -19,14 +19,14 @@ build_env_pre_build_buildpack() { dokku_log_info1 "Adding BUILD_ENV to build environment..." # create build env files for use in buildpacks like this: # https://github.com/niteoweb/heroku-buildpack-buildout/blob/5879fa3418f7d8e079f1aa5816ba1adde73f4948/bin/compile#L34 - id=$(config_bundle --merged "$APP" | docker run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /tmp/env; cat | tar -x -C /tmp/env") - test "$(docker wait "$id")" -eq 0 - docker commit "$id" "$IMAGE" >/dev/null + id=$(config_bundle --merged "$APP" | "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /tmp/env; cat | tar -x -C /tmp/env") + test "$("$DOCKER_BIN" wait "$id")" -eq 0 + "$DOCKER_BIN" commit "$id" "$IMAGE" >/dev/null # create build env for 'old style' buildpacks and dokku plugins - id=$(config_export app "$APP" --format envfile --merged | docker run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "cat >> /app/.env") - test "$(docker wait "$id")" -eq 0 - docker commit "$id" "$IMAGE" >/dev/null + id=$(config_export app "$APP" --format envfile --merged | "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "cat >> /app/.env") + test "$("$DOCKER_BIN" wait "$id")" -eq 0 + "$DOCKER_BIN" commit "$id" "$IMAGE" >/dev/null } build_env_pre_build_buildpack "$@" diff --git a/plugins/common/common.go b/plugins/common/common.go index 99dd24d65..bdc19a95c 100644 --- a/plugins/common/common.go +++ b/plugins/common/common.go @@ -136,7 +136,7 @@ func DirectoryExists(filePath string) bool { // DockerInspect runs an inspect command with a given format against a container id func DockerInspect(containerID, format string) (output string, err error) { - b, err := sh.Command("docker", "inspect", "--format", format, containerID).Output() + b, err := sh.Command(DockerBin(), "inspect", "--format", format, containerID).Output() if err != nil { return "", err } @@ -253,7 +253,7 @@ func IsImageHerokuishBased(image string) bool { } dockerGlobalArgs := os.Getenv("DOKKU_GLOBAL_RUN_ARGS") - parts := []string{"docker", "run", dockerGlobalArgs, "--entrypoint=\"/bin/sh\"", dockerArgs, image, "-c", "\"test -f /exec\""} + parts := []string{DockerBin(), "run", dockerGlobalArgs, "--entrypoint=\"/bin/sh\"", dockerArgs, image, "-c", "\"test -f /exec\""} var dockerCmdParts []string for _, str := range parts { @@ -339,11 +339,21 @@ func VerifyAppName(appName string) (err error) { // VerifyImage returns true if docker image exists in local repo func VerifyImage(image string) bool { - imageCmd := NewShellCmd(strings.Join([]string{"docker inspect", image}, " ")) + imageCmd := NewShellCmd(strings.Join([]string{DockerBin(), "inspect", image}, " ")) imageCmd.ShowOutput = false return imageCmd.Execute() } +// DockerBin returns a string which contains a path to the current docker binary +func DockerBin() string { + dockerBin := os.Getenv("DOCKER_BIN") + if dockerBin == "" { + dockerBin = "docker" + } + + return dockerBin +} + //PlugnTrigger fire the given plugn trigger with the given args func PlugnTrigger(triggerName string, args ...string) error { shellArgs := make([]interface{}, len(args)+2) diff --git a/plugins/common/functions b/plugins/common/functions index 08d921071..10db6dcf8 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -171,7 +171,7 @@ dokku_container_log_verbose_quiet() { OIFS=$IFS IFS=$'\n' local line - for line in $(docker logs "$CID" 2>&1); do + for line in $("$DOCKER_BIN" logs "$CID" 2>&1); do dokku_log_verbose_quiet "$line" done IFS=$OIFS @@ -203,7 +203,7 @@ verify_app_name() { verify_image() { declare desc="verify image existence" local IMAGE="$1" - if (docker inspect "$IMAGE" &>/dev/null); then + if "$DOCKER_BIN" inspect "$IMAGE" &>/dev/null; then return 0 else return 1 @@ -282,7 +282,7 @@ get_running_image_tag() { verify_app_name "$APP" local CIDS=($(get_app_container_ids "$APP")) - local RUNNING_IMAGE_TAG=$(docker inspect -f '{{ .Config.Image }}' "${CIDS[0]}" 2>/dev/null | awk -F: '{ print $2 }' || echo '') + local RUNNING_IMAGE_TAG=$("$DOCKER_BIN" inspect -f '{{ .Config.Image }}' "${CIDS[0]}" 2>/dev/null | awk -F: '{ print $2 }' || echo '') echo "$RUNNING_IMAGE_TAG" } @@ -296,13 +296,13 @@ is_image_herokuish_based() { fi # due to how the build process works, all herokuish images have the Environment variable USER=herokuishuser - USER_VALUE="$(docker inspect -f '{{range .Config.Env}}{{if eq . "USER=herokuishuser" }}{{println .}}{{end}}{{end}}' "$IMAGE")" + USER_VALUE="$("$DOCKER_BIN" inspect -f '{{range .Config.Env}}{{if eq . "USER=herokuishuser" }}{{println .}}{{end}}{{end}}' "$IMAGE")" [[ "$USER_VALUE" == "" ]] && return 1 return 0 } get_docker_version() { - CLIENT_VERSION_STRING="$(docker version -f="{{ .Client.Version }}")" + CLIENT_VERSION_STRING="$("$DOCKER_BIN" version -f="{{ .Client.Version }}")" echo "$CLIENT_VERSION_STRING" } @@ -376,19 +376,19 @@ copy_from_image() { if is_image_herokuish_based "$IMAGE"; then WORKDIR="/app" else - WORKDIR="$(docker inspect -f '{{.Config.WorkingDir}}' "$IMAGE")" + WORKDIR="$("$DOCKER_BIN" inspect -f '{{.Config.WorkingDir}}' "$IMAGE")" fi if [[ -n "$WORKDIR" ]]; then SRC_FILE="${WORKDIR}/${SRC_FILE}" fi fi - local CID=$(docker create "$DOKKU_GLOBAL_RUN_ARGS" "$IMAGE") - if ! docker cp "$CID:$SRC_FILE" "$DST_DIR"; then - docker rm -f "$CID" &>/dev/null + local CID=$("$DOCKER_BIN" create "$DOKKU_GLOBAL_RUN_ARGS" "$IMAGE") + if ! "$DOCKER_BIN" cp "$CID:$SRC_FILE" "$DST_DIR"; then + "$DOCKER_BIN" rm -f "$CID" &>/dev/null return 1 fi - docker rm -f "$CID" &>/dev/null + "$DOCKER_BIN" rm -f "$CID" &>/dev/null else return 1 fi @@ -470,7 +470,7 @@ is_container_running() { local CONTAINER_STATUS dokku_log_warn "Deprecated: common#is_container_status" - CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) + CONTAINER_STATUS=$("$DOCKER_BIN" inspect -f '{{.State.Running}}' "$CID" || true) if [[ "$CONTAINER_STATUS" == "true" ]]; then return 0 @@ -483,7 +483,7 @@ is_container_status() { declare desc="return 0 if given docker container id is in given state" local CID=$1 local TEMPLATE="{{.State.$2}}" - local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" 2>/dev/null || true) + local CONTAINER_STATUS=$("$DOCKER_BIN" inspect -f "$TEMPLATE" "$CID" 2>/dev/null || true) if [[ "$CONTAINER_STATUS" == "true" ]]; then return 0 @@ -529,9 +529,9 @@ dokku_build() { case "$IMAGE_SOURCE_TYPE" in herokuish) DOKKU_IMAGE="$(config_get "$APP" DOKKU_IMAGE || echo "$DOKKU_IMAGE")" - cid=$(tar -c . | docker run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$DOKKU_IMAGE" /bin/bash -c "mkdir -p /app && tar -xC /app") - test "$(docker wait "$cid")" -eq 0 - docker commit "$cid" "$IMAGE" >/dev/null + cid=$(tar -c . | "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$DOKKU_IMAGE" /bin/bash -c "mkdir -p /app && tar -xC /app") + test "$("$DOCKER_BIN" wait "$cid")" -eq 0 + "$DOCKER_BIN" commit "$cid" "$IMAGE" >/dev/null [[ -d $DOKKU_APP_CACHE_DIR ]] || mkdir -p "$DOKKU_APP_CACHE_DIR" plugn trigger pre-build-buildpack "$APP" @@ -543,10 +543,10 @@ dokku_build() { declare -a ARG_ARRAY eval "ARG_ARRAY=($DOCKER_ARGS)" # shellcheck disable=SC2086 - cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d -v $DOKKU_APP_HOST_CACHE_DIR:/cache -e CACHE_PATH=/cache "${ARG_ARRAY[@]}" $IMAGE /build) - docker attach "$cid" - test "$(docker wait "$cid")" -eq 0 - docker commit "$cid" "$IMAGE" >/dev/null + cid=$("$DOCKER_BIN" run $DOKKU_GLOBAL_RUN_ARGS -d -v $DOKKU_APP_HOST_CACHE_DIR:/cache -e CACHE_PATH=/cache "${ARG_ARRAY[@]}" $IMAGE /build) + "$DOCKER_BIN" attach "$cid" + test "$("$DOCKER_BIN" wait "$cid")" -eq 0 + "$DOCKER_BIN" commit "$cid" "$IMAGE" >/dev/null plugn trigger post-build-buildpack "$APP" ;; @@ -574,7 +574,7 @@ dokku_build() { eval "ARG_ARRAY=($DOCKER_ARGS)" # shellcheck disable=SC2086 - docker build "${ARG_ARRAY[@]}" $DOKKU_DOCKER_BUILD_OPTS -t $IMAGE . + "$DOCKER_BIN" build "${ARG_ARRAY[@]}" $DOKKU_DOCKER_BUILD_OPTS -t $IMAGE . plugn trigger post-build-dockerfile "$APP" ;; @@ -600,14 +600,14 @@ dokku_release() { herokuish) plugn trigger pre-release-buildpack "$APP" "$IMAGE_TAG" if [[ -n $(config_export global) ]]; then - cid=$(config_export global | docker run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/00-global-env.sh") - test "$(docker wait "$cid")" -eq 0 - docker commit "$cid" "$IMAGE" >/dev/null + cid=$(config_export global | "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/00-global-env.sh") + test "$("$DOCKER_BIN" wait "$cid")" -eq 0 + "$DOCKER_BIN" commit "$cid" "$IMAGE" >/dev/null fi if [[ -n $(config_export app "$APP") ]]; then - cid=$(config_export app "$APP" | docker run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/01-app-env.sh") - test "$(docker wait "$cid")" -eq 0 - docker commit "$cid" "$IMAGE" >/dev/null + cid=$(config_export app "$APP" | "$DOCKER_BIN" run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/01-app-env.sh") + test "$("$DOCKER_BIN" wait "$cid")" -eq 0 + "$DOCKER_BIN" commit "$cid" "$IMAGE" >/dev/null fi plugn trigger post-release-buildpack "$APP" "$IMAGE_TAG" ;; @@ -713,15 +713,15 @@ docker_cleanup() { # delete all non-running containers # shellcheck disable=SC2046 - docker rm $(docker ps -a -f "status=exited" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true + "$DOCKER_BIN" rm $("$DOCKER_BIN" ps -a -f "status=exited" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true # delete all dead containers # shellcheck disable=SC2046 - docker rm $(docker ps -a -f "status=dead" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true + "$DOCKER_BIN" rm $("$DOCKER_BIN" ps -a -f "status=dead" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true # delete unused images # shellcheck disable=SC2046 - docker rmi $(docker images -f 'dangling=true' -q) &>/dev/null & + "$DOCKER_BIN" rmi $("$DOCKER_BIN" images -f 'dangling=true' -q) &>/dev/null & } get_available_port() { @@ -797,7 +797,7 @@ get_exposed_ports_from_image() { local IMAGE="$1" verify_image "$IMAGE" # shellcheck disable=SC2016 - local DOCKER_IMAGE_EXPOSED_PORTS="$(docker inspect -f '{{range $key, $value := .Config.ExposedPorts}}{{$key}} {{end}}' "$IMAGE")" + local DOCKER_IMAGE_EXPOSED_PORTS="$("$DOCKER_BIN" inspect -f '{{range $key, $value := .Config.ExposedPorts}}{{$key}} {{end}}' "$IMAGE")" echo "$DOCKER_IMAGE_EXPOSED_PORTS" } @@ -805,7 +805,7 @@ get_entrypoint_from_image() { declare desc="return .Config.Entrypoint from passed image name" local IMAGE="$1" verify_image "$IMAGE" - local DOCKER_IMAGE_ENTRYPOINT="$(docker inspect --format '{{range .Config.Entrypoint}}{{.}} {{end}}' "$IMAGE")" + local DOCKER_IMAGE_ENTRYPOINT="$("$DOCKER_BIN" inspect --format '{{range .Config.Entrypoint}}{{.}} {{end}}' "$IMAGE")" echo "ENTRYPOINT $DOCKER_IMAGE_ENTRYPOINT" } @@ -813,7 +813,7 @@ get_cmd_from_image() { declare desc="return .Config.Cmd from passed image name" local IMAGE="$1" verify_image "$IMAGE" - local DOCKER_IMAGE_CMD="$(docker inspect --format '{{range .Config.Cmd}}{{.}} {{end}}' "$IMAGE")" + local DOCKER_IMAGE_CMD="$("$DOCKER_BIN" inspect --format '{{range .Config.Cmd}}{{.}} {{end}}' "$IMAGE")" DOCKER_IMAGE_CMD="${DOCKER_IMAGE_CMD/\/bin\/sh -c/}" echo "CMD $DOCKER_IMAGE_CMD" } @@ -851,7 +851,7 @@ get_container_ports() { local cid for cid in $APP_CIDS; do - local container_ports="$(docker port "$cid" | awk '{ print $3 "->" $1}' | awk -F ":" '{ print $2 }')" + local container_ports="$("$DOCKER_BIN" port "$cid" | awk '{ print $3 "->" $1}' | awk -F ":" '{ print $2 }')" done echo "$container_ports" diff --git a/plugins/enter/subcommands/default b/plugins/enter/subcommands/default index a822824ec..5eb6ffbc3 100755 --- a/plugins/enter/subcommands/default +++ b/plugins/enter/subcommands/default @@ -60,7 +60,7 @@ enter_default_cmd() { has_tty && local DOKKU_RUN_OPTS+=" -i -t" is_image_herokuish_based "$IMAGE" && local EXEC_CMD="/exec" # shellcheck disable=SC2086 - docker exec $DOKKU_RUN_OPTS $ID $EXEC_CMD "${@:-$DOKKU_APP_SHELL}" + "$DOCKER_BIN" exec $DOKKU_RUN_OPTS $ID $EXEC_CMD "${@:-$DOKKU_APP_SHELL}" } enter_default_cmd "$@" diff --git a/plugins/network/network.go b/plugins/network/network.go index 55a32c629..c561986a8 100644 --- a/plugins/network/network.go +++ b/plugins/network/network.go @@ -132,7 +132,7 @@ func GetContainerPort(appName, processType string, isHerokuishContainer bool, co break } } - cmd := sh.Command("docker", "port", containerID, port) + cmd := sh.Command(common.DockerBin(), "port", containerID, port) cmd.Stderr = ioutil.Discard b, err := cmd.Output() if err == nil { diff --git a/plugins/ps/internal-functions b/plugins/ps/internal-functions index 4cab309cb..c618041e8 100755 --- a/plugins/ps/internal-functions +++ b/plugins/ps/internal-functions @@ -61,7 +61,7 @@ cmd-ps-report-single() { local APP_CONTAINER_STATUS for CONTAINER_FILE in $CONTAINER_FILES; do CID=$(<"$DOKKU_ROOT/$APP/$CONTAINER_FILE") - APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Status}}' "$CID" 2>/dev/null || true) + APP_CONTAINER_STATUS=$("$DOCKER_BIN" inspect -f '{{.State.Status}}' "$CID" 2>/dev/null || true) [[ -z "$APP_CONTAINER_STATUS" ]] && APP_CONTAINER_STATUS="missing" STATUSES+=("${CONTAINER_FILE#*.}:$APP_CONTAINER_STATUS#${CID:0:12}") done diff --git a/plugins/ps/subcommands/default b/plugins/ps/subcommands/default index ed5ca1182..8fc9f35c2 100755 --- a/plugins/ps/subcommands/default +++ b/plugins/ps/subcommands/default @@ -21,7 +21,7 @@ ps_main_cmd() { has_tty && local DOKKU_RUN_OPTS="-i -t" dokku_log_info1_quiet "running processes in container: $CID" # shellcheck disable=SC2086 - docker exec $DOKKU_RUN_OPTS $CID /bin/sh -c "ps auxwww" + "$DOCKER_BIN" exec $DOKKU_RUN_OPTS $CID /bin/sh -c "ps auxwww" done } diff --git a/plugins/repo/src/subcommands/purge-cache/purge-cache.go b/plugins/repo/src/subcommands/purge-cache/purge-cache.go index 6a39cde85..a1cf19728 100644 --- a/plugins/repo/src/subcommands/purge-cache/purge-cache.go +++ b/plugins/repo/src/subcommands/purge-cache/purge-cache.go @@ -25,7 +25,9 @@ func main() { dokkuGlobalRunArgs := common.MustGetEnv("DOKKU_GLOBAL_RUN_ARGS") image := common.GetDeployingAppImageName(appName, "", "") if info, _ := os.Stat(cacheDir); info != nil && info.IsDir() { - purgeCacheCmd := common.NewShellCmd(strings.Join([]string{"docker run --rm", dokkuGlobalRunArgs, + purgeCacheCmd := common.NewShellCmd(strings.Join([]string{ + common.DockerBin(), + "run --rm", dokkuGlobalRunArgs, "-v", strings.Join([]string{cacheHostDir, ":/cache"}, ""), image, `find /cache -depth -mindepth 1 -maxdepth 1 -exec rm -Rf {} ;`}, " ")) purgeCacheCmd.Execute() diff --git a/plugins/scheduler-docker-local/check-deploy b/plugins/scheduler-docker-local/check-deploy index 721d9c0e6..148c427f7 100755 --- a/plugins/scheduler-docker-local/check-deploy +++ b/plugins/scheduler-docker-local/check-deploy @@ -85,7 +85,7 @@ scheduler-docker-local-check-deploy() { # after successfully copying the file. Thus, we suppress stderr. # ref: https://github.com/dotcloud/docker/issues/3986 local CHECK_DEPLOY_TMP_WORK_DIR=$(mktemp -d "/tmp/dokku-${FUNCNAME[0]}.XXXX") - docker cp "$DOKKU_APP_CONTAINER_ID:/app/CHECKS" "$CHECK_DEPLOY_TMP_WORK_DIR" 2>/dev/null || true + "$DOCKER_BIN" cp "$DOKKU_APP_CONTAINER_ID:/app/CHECKS" "$CHECK_DEPLOY_TMP_WORK_DIR" 2>/dev/null || true local FILENAME=${CHECK_DEPLOY_TMP_WORK_DIR}/CHECKS @@ -119,10 +119,10 @@ scheduler-docker-local-check-deploy() { sleep "$DOKKU_DEFAULT_CHECKS_WAIT" ! (is_container_status "$DOKKU_APP_CONTAINER_ID" "Running") && dokku_log_fail "App container failed to start!!" - local container_restarts="$(docker inspect -f "{{ .RestartCount }}" "$DOKKU_APP_CONTAINER_ID")" + local container_restarts="$("$DOCKER_BIN" inspect -f "{{ .RestartCount }}" "$DOKKU_APP_CONTAINER_ID")" if [[ $container_restarts -ne 0 ]]; then - docker container update --restart=no "$DOKKU_APP_CONTAINER_ID" &>/dev/null || true - docker stop "$DOKKU_APP_CONTAINER_ID" || true + "$DOCKER_BIN" container update --restart=no "$DOKKU_APP_CONTAINER_ID" &>/dev/null || true + "$DOCKER_BIN" stop "$DOKKU_APP_CONTAINER_ID" || true dokku_log_fail "App container failed to start!!" fi diff --git a/plugins/scheduler-docker-local/core-post-deploy b/plugins/scheduler-docker-local/core-post-deploy index 5a24b04ef..f78f34c49 100755 --- a/plugins/scheduler-docker-local/core-post-deploy +++ b/plugins/scheduler-docker-local/core-post-deploy @@ -36,26 +36,26 @@ scheduler-docker-local-core-post-deploy() { local NAME="$APP.$DYNO" local CURRENT_CONTAINER_ID="$(<"$container")" # TODO: Ensure these are from the current service - local PREVIOUS_CIDS=$(docker ps -a -q -f name="^.?$NAME\$" | xargs) || true + local PREVIOUS_CIDS=$("$DOCKER_BIN" ps -a -q -f name="^.?$NAME\$" | xargs) || true if [[ -n $PREVIOUS_CIDS ]]; then dokku_log_info1_quiet "Found previous container(s) ($PREVIOUS_CIDS) named $NAME" # in case $PREVIOUS_CIDS has more than one entry local cid for cid in $PREVIOUS_CIDS; do - local PREVIOUS_CONTAINER_STATUS=$(docker inspect -f '{{.State.Status}}' "$cid" || echo "dead") + local PREVIOUS_CONTAINER_STATUS=$("$DOCKER_BIN" inspect -f '{{.State.Status}}' "$cid" || echo "dead") # dead containers cannot be renamed if [[ "$PREVIOUS_CONTAINER_STATUS" != "dead" ]]; then local CONTAINER_DATE_NAME="$NAME.$(date +%s)" dokku_log_info2_quiet "Renaming container ($cid) ${NAME} to $CONTAINER_DATE_NAME" - docker rename "$NAME" "$CONTAINER_DATE_NAME" >/dev/null 2>&1 || dokku_log_warn "Unable to rename container" + "$DOCKER_BIN" rename "$NAME" "$CONTAINER_DATE_NAME" >/dev/null 2>&1 || dokku_log_warn "Unable to rename container" fi done fi local ID=$(cat "$container") - local CURRENT_NAME=$(docker inspect -f '{{.Name}}' "$ID" | tr -d /) + local CURRENT_NAME=$("$DOCKER_BIN" inspect -f '{{.Name}}' "$ID" | tr -d /) if [[ -n "$CURRENT_NAME" ]]; then dokku_log_info2_quiet "Renaming container (${ID:0:12}) $CURRENT_NAME to $NAME" - docker rename "$CURRENT_NAME" "$NAME" >/dev/null + "$DOCKER_BIN" rename "$CURRENT_NAME" "$NAME" >/dev/null fi done shopt -u nullglob diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index 7dc24d0bf..b787a067d 100755 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -95,7 +95,7 @@ fn-scheduler-docker-local-retire-container() { declare APP="$1" CID="$2" DEAD_TIME="$3" local STATE - STATE="$(docker inspect -f "{{ .State.Status }}" "$CID" 2>/dev/null || true)" + STATE="$("$DOCKER_BIN" inspect -f "{{ .State.Status }}" "$CID" 2>/dev/null || true)" if [[ -z "$STATE" ]]; then return fi @@ -104,7 +104,7 @@ fn-scheduler-docker-local-retire-container() { [[ $DOKKU_DOCKER_STOP_TIMEOUT ]] && DOCKER_STOP_TIME_ARG="--time=${DOKKU_DOCKER_STOP_TIMEOUT}" if [[ "$STATE" == "restarting" ]]; then - docker update --restart=no "$CID" >/dev/null 2>&1 + "$DOCKER_BIN" update --restart=no "$CID" >/dev/null 2>&1 fi if [[ "$STATE" != "dead" ]] && [[ "$STATE" != "exited" ]]; then @@ -112,18 +112,18 @@ fn-scheduler-docker-local-retire-container() { # to not send SIGKILL as the docs would indicate. If that fails, move # on to the next. # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG "$CID" \ - || docker kill "$CID" \ + "$DOCKER_BIN" stop $DOCKER_STOP_TIME_ARG "$CID" \ + || "$DOCKER_BIN" kill "$CID" \ || dokku_log_warn "Unable to kill container ${CID}" fi - STATE="$(docker inspect -f "{{ .State.Status }}" "$CID" 2>/dev/null || true)" + STATE="$("$DOCKER_BIN" inspect -f "{{ .State.Status }}" "$CID" 2>/dev/null || true)" if [[ -z "$STATE" ]]; then return fi if [[ "$STATE" != "dead" ]] && [[ "$STATE" != "exited" ]]; then - if ! docker kill "$CID"; then + if ! "$DOCKER_BIN" kill "$CID"; then dokku_log_warn "Unable to kill container ${CID}" fi fi diff --git a/plugins/scheduler-docker-local/post-delete b/plugins/scheduler-docker-local/post-delete index c180c0905..405ecde4f 100755 --- a/plugins/scheduler-docker-local/post-delete +++ b/plugins/scheduler-docker-local/post-delete @@ -18,14 +18,14 @@ scheduler-docker-local-post-delete() { # remove all application containers & images # shellcheck disable=SC2046 - local DOKKU_APP_CIDS=$(docker ps -a --no-trunc | egrep "dokku/${APP}:" | awk '{ print $1 }' | xargs) + local DOKKU_APP_CIDS=$("$DOCKER_BIN" ps -a --no-trunc | egrep "dokku/${APP}:" | awk '{ print $1 }' | xargs) if [[ -n "$DOKKU_APP_CIDS" ]]; then # shellcheck disable=SC2086 - docker rm -f $DOKKU_APP_CIDS >/dev/null 2>&1 || true + "$DOCKER_BIN" rm -f $DOKKU_APP_CIDS >/dev/null 2>&1 || true fi # shellcheck disable=SC2046 - docker rmi $(docker images -q "$IMAGE_REPO" | xargs) &>/dev/null || true + "$DOCKER_BIN" rmi $("$DOCKER_BIN" images -q "$IMAGE_REPO" | xargs) &>/dev/null || true } scheduler-docker-local-post-delete "$@" diff --git a/plugins/scheduler-docker-local/pre-deploy b/plugins/scheduler-docker-local/pre-deploy index d1b798799..244b65830 100755 --- a/plugins/scheduler-docker-local/pre-deploy +++ b/plugins/scheduler-docker-local/pre-deploy @@ -42,7 +42,7 @@ scheduler-docker-local-pre-deploy() { fi # shellcheck disable=SC2086 - docker run $DOKKU_GLOBAL_RUN_ARGS "${ARG_ARRAY[@]}" $IMAGE /bin/bash -c "find $CONTAINER_PATHS -not -user $DOKKU_APP_USER -print0 | xargs -0 -r chown -R $DOKKU_APP_USER" || true + "$DOCKER_BIN" run $DOKKU_GLOBAL_RUN_ARGS "${ARG_ARRAY[@]}" $IMAGE /bin/bash -c "find $CONTAINER_PATHS -not -user $DOKKU_APP_USER -print0 | xargs -0 -r chown -R $DOKKU_APP_USER" || true } scheduler-docker-local-pre-deploy "$@" diff --git a/plugins/scheduler-docker-local/pre-restore b/plugins/scheduler-docker-local/pre-restore index 7423a636f..802167ffb 100755 --- a/plugins/scheduler-docker-local/pre-restore +++ b/plugins/scheduler-docker-local/pre-restore @@ -14,7 +14,7 @@ scheduler-docker-local-pre-restore() { # delete all "old" containers # shellcheck disable=SC2046 - docker rm $(docker ps --format "{{.Names}}" -a -f "label=$DOKKU_CONTAINER_LABEL" -q | grep -E '(.+\..+\.[0-9]+\.[0-9]+$)') &>/dev/null || true + "$DOCKER_BIN" rm $("$DOCKER_BIN" ps --format "{{.Names}}" -a -f "label=$DOKKU_CONTAINER_LABEL" -q | grep -E '(.+\..+\.[0-9]+\.[0-9]+$)') &>/dev/null || true } scheduler-docker-local-pre-restore "$@" diff --git a/plugins/scheduler-docker-local/scheduler-deploy b/plugins/scheduler-docker-local/scheduler-deploy index 99f73a262..8fd16640f 100755 --- a/plugins/scheduler-docker-local/scheduler-deploy +++ b/plugins/scheduler-docker-local/scheduler-deploy @@ -52,10 +52,10 @@ scheduler-docker-local-scheduler-deploy() { dokku_log_info2 "stopping $APP.$PROC_TYPE ($cid)" # Disable the container restart policy - docker container update --restart=no "$cid" &>/dev/null || true + "$DOCKER_BIN" container update --restart=no "$cid" &>/dev/null || true # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG "$cid" &>/dev/null + "$DOCKER_BIN" stop $DOCKER_STOP_TIME_ARG "$cid" &>/dev/null # remove cid from oldids to skip the old container finish processing oldids="$(remove_val_from_list "$cid" "$oldids" " ")" done @@ -94,16 +94,16 @@ scheduler-docker-local-scheduler-deploy() { START_CMD=$(fn-scheduler-docker-local-extract-start-cmd "$APP" "$PROC_TYPE" "$START_CMD" "$DOKKU_HEROKUISH" "$DOKKU_PORT") if [[ "$DOKKU_NETWORK_BIND_ALL" == "false" ]]; then # shellcheck disable=SC2086 - cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + cid=$("$DOCKER_BIN" run $DOKKU_GLOBAL_RUN_ARGS -d -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) else # shellcheck disable=SC2086 - cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d $DOKKU_DOCKER_PORT_ARGS -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + cid=$("$DOCKER_BIN" run $DOKKU_GLOBAL_RUN_ARGS -d $DOKKU_DOCKER_PORT_ARGS -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) fi else START_CMD=$(fn-scheduler-docker-local-extract-start-cmd "$APP" "$PROC_TYPE" "$START_CMD" "$DOKKU_HEROKUISH") # shellcheck disable=SC2086 - cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + cid=$("$DOCKER_BIN" run $DOKKU_GLOBAL_RUN_ARGS -d "${ARG_ARRAY[@]}" $IMAGE $START_CMD) fi ipaddr=$(plugn trigger network-get-ipaddr "$APP" "$PROC_TYPE" "$cid") @@ -114,10 +114,10 @@ scheduler-docker-local-scheduler-deploy() { declare CID="$1" PROC_TYPE="$2" CONTAINER_INDEX="$3" mkdir -p "${DOKKU_LIB_ROOT}/data/scheduler-docker-local/$APP" echo "${CID} ${PROC_TYPE}.${CONTAINER_INDEX}" >>"${DOKKU_LIB_ROOT}/data/scheduler-docker-local/$APP/failed-containers" - docker inspect "$CID" &>/dev/null && { + "$DOCKER_BIN" inspect "$CID" &>/dev/null && { # Disable the container restart policy - docker container update --restart=no "$CID" &>/dev/null || true - docker stop "$CID" >/dev/null && docker kill "$CID" &>/dev/null + "$DOCKER_BIN" container update --restart=no "$CID" &>/dev/null || true + "$DOCKER_BIN" stop "$CID" >/dev/null && "$DOCKER_BIN" kill "$CID" &>/dev/null } trap - INT TERM EXIT kill -9 $$ @@ -181,14 +181,14 @@ scheduler-docker-local-scheduler-deploy() { sleep "$WAIT" for oldid in $oldids; do # Disable the container restart policy - docker container update --restart=no "$oldid" &>/dev/null || true + "$DOCKER_BIN" container update --restart=no "$oldid" &>/dev/null || true # Attempt to stop, if that fails, then force a kill as docker seems # to not send SIGKILL as the docs would indicate. If that fails, move # on to the next. # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG "$oldid" \ - || docker kill "$oldid" \ + "$DOCKER_BIN" stop $DOCKER_STOP_TIME_ARG "$oldid" \ + || "$DOCKER_BIN" kill "$oldid" \ || plugn trigger retire-container-failed "$APP" "$oldid" # plugin trigger for event logging done ) & diff --git a/plugins/scheduler-docker-local/scheduler-docker-cleanup b/plugins/scheduler-docker-local/scheduler-docker-cleanup index 73e6e7a7d..5e89ef8cd 100755 --- a/plugins/scheduler-docker-local/scheduler-docker-cleanup +++ b/plugins/scheduler-docker-local/scheduler-docker-cleanup @@ -14,15 +14,15 @@ scheduler-docker-local-scheduler-docker-cleanup() { # delete all non-running containers # shellcheck disable=SC2046 - docker rm $(docker ps -a -f "status=exited" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true + "$DOCKER_BIN" rm $("$DOCKER_BIN" ps -a -f "status=exited" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true # delete all dead containers # shellcheck disable=SC2046 - docker rm $(docker ps -a -f "status=dead" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true + "$DOCKER_BIN" rm $("$DOCKER_BIN" ps -a -f "status=dead" -f "label=$DOKKU_CONTAINER_LABEL" -q) &>/dev/null || true # delete unused images # shellcheck disable=SC2046 - docker rmi $(docker images -f 'dangling=true' -q) &>/dev/null & + "$DOCKER_BIN" rmi $("$DOCKER_BIN" images -f 'dangling=true' -q) &>/dev/null & } scheduler-docker-local-scheduler-docker-cleanup "$@" diff --git a/plugins/scheduler-docker-local/scheduler-inspect b/plugins/scheduler-docker-local/scheduler-inspect index 1a4eb6719..5353f3291 100755 --- a/plugins/scheduler-docker-local/scheduler-inspect +++ b/plugins/scheduler-docker-local/scheduler-inspect @@ -48,7 +48,7 @@ EOF for CONTAINER_FILE in $CONTAINER_FILES; do CIDS+="$(<"$DOKKU_ROOT/$APP/$CONTAINER_FILE")" done - docker inspect "${CIDS[@]}" | python2.7 "$TMP_INSPECT_CMD" + "$DOCKER_BIN" inspect "${CIDS[@]}" | python2.7 "$TMP_INSPECT_CMD" } diff --git a/plugins/scheduler-docker-local/scheduler-logs b/plugins/scheduler-docker-local/scheduler-logs index 724a1d4f8..d785388e8 100755 --- a/plugins/scheduler-docker-local/scheduler-logs +++ b/plugins/scheduler-docker-local/scheduler-logs @@ -33,10 +33,10 @@ scheduler-docker-local-scheduler-logs() { local CID=$(<"${CONTAINERS[i]}") local COLOR=${COLORS[i % ${#COLORS[*]}]} if [[ $PRETTY_PRINT == "true" ]]; then - local DOKKU_LOGS_CMD+="(docker logs $DOKKU_LOGS_ARGS $CID 2>&1)" + local DOKKU_LOGS_CMD+="($DOCKER_BIN logs $DOKKU_LOGS_ARGS $CID 2>&1)" else local DOKKU_LOGS_PRETTY_PRINT_CMD="sed -r 's/^([^Z]+Z )/\x1b[${COLOR}m\1app[$DYNO]:\x1b[0m /gm'" - local DOKKU_LOGS_CMD+="(docker logs -t $DOKKU_LOGS_ARGS $CID 2>&1 | $DOKKU_LOGS_PRETTY_PRINT_CMD)" + local DOKKU_LOGS_CMD+="($DOCKER_BIN logs -t $DOKKU_LOGS_ARGS $CID 2>&1 | $DOKKU_LOGS_PRETTY_PRINT_CMD)" fi if [[ $i != "$MAX_INDEX" ]]; then local DOKKU_LOGS_CMD+="& " diff --git a/plugins/scheduler-docker-local/scheduler-logs-failed b/plugins/scheduler-docker-local/scheduler-logs-failed index d816155e2..476e91b72 100755 --- a/plugins/scheduler-docker-local/scheduler-logs-failed +++ b/plugins/scheduler-docker-local/scheduler-logs-failed @@ -24,7 +24,7 @@ scheduler-docker-local-scheduler-logs-failed() { while read -r LINE || [[ -n "$LINE" ]]; do CID="$(echo "$LINE" | cut -d ' ' -f1)" PREFIX="$(echo "$LINE" | cut -d ' ' -f2)" - if docker inspect "${CID}" >/dev/null 2>&1; then + if "$DOCKER_BIN" inspect "${CID}" >/dev/null 2>&1; then RUNNING_CONTAINERS+=("$CID") else DEAD_CONTAINERS+=("$CID") @@ -44,7 +44,7 @@ scheduler-docker-local-scheduler-logs-failed() { ((MAX_INDEX = ${#RUNNING_CONTAINERS[*]} - 1)) || true for i in ${!RUNNING_CONTAINERS[*]}; do local CID="${RUNNING_CONTAINERS[i]}" - DOKKU_LOGS_CMD+="(docker logs $DOKKU_LOGS_ARGS $CID 2>&1)" + DOKKU_LOGS_CMD+="($DOCKER_BIN logs $DOKKU_LOGS_ARGS $CID 2>&1)" if [[ $i != "$MAX_INDEX" ]]; then local DOKKU_LOGS_CMD+="& " else diff --git a/plugins/scheduler-docker-local/scheduler-retire b/plugins/scheduler-docker-local/scheduler-retire index c65c2c66e..af24e75ad 100755 --- a/plugins/scheduler-docker-local/scheduler-retire +++ b/plugins/scheduler-docker-local/scheduler-retire @@ -27,7 +27,7 @@ scheduler-docker-local-scheduler-retire() { fi fn-scheduler-docker-local-retire-container "$APP" "$CID" "$DEAD_TIME" - STATE="$(docker inspect -f "{{ .State.Status }}" "$CID" 2>/dev/null || true)" + STATE="$("$DOCKER_BIN" inspect -f "{{ .State.Status }}" "$CID" 2>/dev/null || true)" if [[ -z "$STATE" ]]; then DEAD_CONTAINERS+=("$CID") continue @@ -38,8 +38,8 @@ scheduler-docker-local-scheduler-retire() { continue fi - docker rm -f "$CID" >/dev/null 2>&1 || true - if docker inspect "${CID}" >/dev/null 2>&1; then + "$DOCKER_BIN" rm -f "$CID" >/dev/null 2>&1 || true + if "$DOCKER_BIN" inspect "${CID}" >/dev/null 2>&1; then dokku_log_warn "Container ${CID} still running" continue fi diff --git a/plugins/scheduler-docker-local/scheduler-run b/plugins/scheduler-docker-local/scheduler-run index 6ace670c5..478a429a1 100755 --- a/plugins/scheduler-docker-local/scheduler-run +++ b/plugins/scheduler-docker-local/scheduler-run @@ -66,7 +66,7 @@ scheduler-docker-local-scheduler-run() { fi # shellcheck disable=SC2086 - docker run $DOKKU_GLOBAL_RUN_ARGS "${DOCKER_ARGS_ARRAY[@]}" $IMAGE $EXEC_CMD "$@" + "$DOCKER_BIN" run $DOKKU_GLOBAL_RUN_ARGS "${DOCKER_ARGS_ARRAY[@]}" $IMAGE $EXEC_CMD "$@" } scheduler-docker-local-scheduler-run "$@" diff --git a/plugins/scheduler-docker-local/scheduler-stop b/plugins/scheduler-docker-local/scheduler-stop index 3edb3431a..553b950bd 100755 --- a/plugins/scheduler-docker-local/scheduler-stop +++ b/plugins/scheduler-docker-local/scheduler-stop @@ -21,10 +21,10 @@ scheduler-docker-local-scheduler-stop() { if [[ -n "$DOKKU_APP_RUNNING_CONTAINER_IDS" ]]; then # Disable the container restart policy # shellcheck disable=SC2086 - docker container update --restart=no $DOKKU_APP_RUNNING_CONTAINER_IDS &>/dev/null || true + "$DOCKER_BIN" container update --restart=no $DOKKU_APP_RUNNING_CONTAINER_IDS &>/dev/null || true # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG $DOKKU_APP_RUNNING_CONTAINER_IDS >/dev/null || true + "$DOCKER_BIN" stop $DOCKER_STOP_TIME_ARG $DOKKU_APP_RUNNING_CONTAINER_IDS >/dev/null || true fi if [[ "$REMOVE_CONTAINERS" == "true" ]]; then @@ -32,7 +32,7 @@ scheduler-docker-local-scheduler-stop() { if [[ -n "$DOKKU_APP_CIDS" ]]; then # shellcheck disable=SC2086 - docker rm -f $DOKKU_APP_CIDS >/dev/null 2>&1 || true + "$DOCKER_BIN" rm -f $DOKKU_APP_CIDS >/dev/null 2>&1 || true fi fi } diff --git a/plugins/scheduler-docker-local/scheduler-tags-create b/plugins/scheduler-docker-local/scheduler-tags-create index c4c41d81d..5d04aa6f7 100755 --- a/plugins/scheduler-docker-local/scheduler-tags-create +++ b/plugins/scheduler-docker-local/scheduler-tags-create @@ -15,7 +15,7 @@ scheduler-docker-local-scheduler-tags-create() { local TAG_OPTS="" [[ $(is_tag_force_available) ]] && TAG_OPTS="-f" # shellcheck disable=SC2086 - docker tag $TAG_OPTS "$SOURCE_IMAGE" "$TARGET_IMAGE" + "$DOCKER_BIN" tag $TAG_OPTS "$SOURCE_IMAGE" "$TARGET_IMAGE" } is_tag_force_available() { diff --git a/plugins/scheduler-docker-local/scheduler-tags-destroy b/plugins/scheduler-docker-local/scheduler-tags-destroy index 5c3ccfb1d..0fbaeab2f 100755 --- a/plugins/scheduler-docker-local/scheduler-tags-destroy +++ b/plugins/scheduler-docker-local/scheduler-tags-destroy @@ -12,7 +12,7 @@ scheduler-docker-local-scheduler-tags-destroy() { return fi - docker rmi "$IMAGE_REPO:$IMAGE_TAG" + "$DOCKER_BIN" rmi "$IMAGE_REPO:$IMAGE_TAG" } scheduler-docker-local-scheduler-tags-destroy "$@" diff --git a/plugins/tags/subcommands/default b/plugins/tags/subcommands/default index 1c3595123..7ccecf21e 100755 --- a/plugins/tags/subcommands/default +++ b/plugins/tags/subcommands/default @@ -12,7 +12,7 @@ tags_main_cmd() { verify_app_name "$APP" dokku_log_info2_quiet "Image tags for $IMAGE_REPO" - docker images "$IMAGE_REPO" + "$DOCKER_BIN" images "$IMAGE_REPO" } tags_main_cmd "$@" diff --git a/tests/unit/40_report.bats b/tests/unit/40_report.bats index a6daecec7..d4ddedfcb 100644 --- a/tests/unit/40_report.bats +++ b/tests/unit/40_report.bats @@ -5,9 +5,11 @@ load test_helper setup() { global_setup deploy_app + rm -f /tmp/fake-docker-bin } teardown() { + rm -f /tmp/fake-docker-bin destroy_app global_teardown } @@ -46,3 +48,33 @@ teardown() { dokku --force apps:destroy "${TEST_APP}-2" } + +@test "(report) custom docker bin" { + export DOCKER_BIN="docker" + run /bin/bash -c "dokku report" + echo "output: $output" + echo "status: $status" + assert_output_contains "herokuish version:" + assert_success + + export DOCKER_BIN="/usr/bin/docker" + run /bin/bash -c "dokku report" + echo "output: $output" + echo "status: $status" + assert_output_contains "herokuish version:" + assert_success + + touch /tmp/fake-docker-bin + echo '#!/usr/bin/env bash' >/tmp/fake-docker-bin + echo '/usr/bin/docker "$@"' >>/tmp/fake-docker-bin + chmod +x /tmp/fake-docker-bin + + export DOCKER_BIN="/tmp/fake-docker-bin" + run /bin/bash -c "dokku report" + echo "output: $output" + echo "status: $status" + assert_output_contains "herokuish version:" + assert_success + + unset DOCKER_BIN +} From 79d4f4578d2aa4aec22c3252c1691ffaaa651294 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 29 May 2019 00:45:36 -0400 Subject: [PATCH 2/2] fix: use correct method for executing dokku within tests --- tests/unit/20_nginx-vhosts_1.bats | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/20_nginx-vhosts_1.bats b/tests/unit/20_nginx-vhosts_1.bats index 8a5c8eeb3..c71d9bc55 100644 --- a/tests/unit/20_nginx-vhosts_1.bats +++ b/tests/unit/20_nginx-vhosts_1.bats @@ -136,7 +136,7 @@ teardown() { deploy_app create_attach_network - run dokku nginx:build-config "$TEST_APP" + run /bin/bash -c "dokku nginx:build-config $TEST_APP" echo "output: "$output echo "status: "$status assert_success