From d7386317fca767477ecb7f7f19b3f401952aaa89 Mon Sep 17 00:00:00 2001 From: Michael Hobbs Date: Fri, 6 May 2016 11:30:22 -0700 Subject: [PATCH] support deployment of arbitrary docker images not built by dokku build. closes #2153 --- .../00_dokku-standard/exec-app-json-scripts | 12 ++++---- plugins/common/functions | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/plugins/00_dokku-standard/exec-app-json-scripts b/plugins/00_dokku-standard/exec-app-json-scripts index 6568df294..6da8c9203 100755 --- a/plugins/00_dokku-standard/exec-app-json-scripts +++ b/plugins/00_dokku-standard/exec-app-json-scripts @@ -23,7 +23,8 @@ get_phase_script() { execute_script() { declare desc="executes appropriate phase script key from app.json" - local APP="$1"; local IMAGE="$2"; local PHASE_SCRIPT_KEY="$3" + local APP="$1"; local IMAGE_TAG="$2"; local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") + local PHASE_SCRIPT_KEY="$3" local SCRIPT_CMD=$(get_phase_script "$IMAGE" "$PHASE_SCRIPT_KEY" 2>/dev/null) if [[ -n "$SCRIPT_CMD" ]];then dokku_log_info1 "Running '$SCRIPT_CMD' in app container" @@ -48,7 +49,7 @@ execute_script() { COMMAND+=" fi " local CACHE_DIR="$DOKKU_ROOT/$APP/cache" - local DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP") + local DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG") # strip --restart args from DOCKER_ARGS local DOCKER_ARGS=$(sed -e "s/--restart=[[:graph:]]\+[[:blank:]]\?//g" <<< "$DOCKER_ARGS") @@ -60,6 +61,9 @@ execute_script() { if ! is_image_herokuish_based "$IMAGE"; then local DOKKU_DOCKERFILE_ENTRYPOINT=$(config_get "$APP" DOKKU_DOCKERFILE_ENTRYPOINT) local DOKKU_DOCKERFILE_CMD=$(config_get "$APP" DOKKU_DOCKERFILE_CMD) + [[ -z "$DOKKU_DOCKERFILE_ENTRYPOINT" ]] && DOKKU_DOCKERFILE_ENTRYPOINT="$(get_entrypoint_from_image "$IMAGE")" + [[ -z "$DOKKU_DOCKERFILE_CMD" ]] && DOKKU_DOCKERFILE_CMD="$(get_cmd_from_image "$IMAGE")" + [[ -n "$DOKKU_DOCKERFILE_ENTRYPOINT" ]] && local DOCKER_COMMIT_ENTRYPOINT_CHANGE_ARG="--change='$DOKKU_DOCKERFILE_ENTRYPOINT'" [[ -n "$DOKKU_DOCKERFILE_CMD" ]] && local DOCKER_COMMIT_CMD_CHANGE_ARG="--change='$DOKKU_DOCKERFILE_CMD'" @@ -83,18 +87,16 @@ exec_app_json_scripts() { case "$0" in *pre-deploy) local IMAGE_TAG="$2" - local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") local PHASE_SCRIPT_KEY="predeploy" ;; *post-deploy) local IMAGE_TAG="$4" - local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") local PHASE_SCRIPT_KEY="postdeploy" ;; esac dokku_log_info1 "Attempting to run scripts.dokku.$PHASE_SCRIPT_KEY from app.json (if defined)" - execute_script "$APP" "$IMAGE" "$PHASE_SCRIPT_KEY" + execute_script "$APP" "$IMAGE_TAG" "$PHASE_SCRIPT_KEY" } exec_app_json_scripts "$@" diff --git a/plugins/common/functions b/plugins/common/functions index 9852751d9..26e947b40 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -391,6 +391,11 @@ release_and_deploy() { local IMAGE_SOURCE_TYPE="herokuish" else local IMAGE_SOURCE_TYPE="dockerfile" + local DOKKU_DOCKERFILE_PORTS=$(config_get "$APP" DOKKU_DOCKERFILE_PORTS || true) + if [[ -z "$DOKKU_DOCKERFILE_PORTS" ]]; then + local DOCKER_IMAGE_PORTS=$(get_exposed_ports_from_image "$IMAGE") + [[ -n "$DOCKER_IMAGE_PORTS" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_PORTS="$DOCKER_IMAGE_PORTS" + fi fi local DOKKU_APP_SKIP_DEPLOY="$(config_get "$APP" DOKKU_SKIP_DEPLOY || true)" @@ -574,6 +579,29 @@ get_dockerfile_exposed_ports() { echo "$DOCKERFILE_PORTS" } +get_exposed_ports_from_image() { + declare desc="return all exposed ports from passed image name" + 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")" + echo "$DOCKER_IMAGE_EXPOSED_PORTS" +} + +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")" + echo "ENTRYPOINT $DOCKER_IMAGE_ENTRYPOINT" +} + +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")" + DOCKER_IMAGE_CMD="${DOCKER_IMAGE_CMD/\/bin\/sh -c/}" + echo "CMD $DOCKER_IMAGE_CMD" +} + extract_directive_from_dockerfile() { declare desc="return requested directive from passed file path" local FILE_PATH="$1"; local SEARCH_STRING="$2"