From 8e4dc1c2d0b4f19a4adb61b1ad233279c0c06b77 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 18 Feb 2020 01:32:26 -0500 Subject: [PATCH 1/6] feat: label released images This will allow us to properly handle cases where the labeled image isn't actually the correct image due to invalid builds. --- plugins/builder-dockerfile/builder-release | 1 + plugins/builder-herokuish/builder-release | 2 ++ 2 files changed, 3 insertions(+) diff --git a/plugins/builder-dockerfile/builder-release b/plugins/builder-dockerfile/builder-release index 7b8cef709..8f3ac4cbc 100755 --- a/plugins/builder-dockerfile/builder-release +++ b/plugins/builder-dockerfile/builder-release @@ -13,6 +13,7 @@ trigger-builder-dockerfile-builder-release() { # buildstep plugins don't necessarily make sense for dockerfiles. call the new breed!!! plugn trigger pre-release-dockerfile "$APP" "$IMAGE_TAG" + echo "FROM $IMAGE" | docker build --label=com.dokku.image-stage=release -t "$IMAGE" - plugn trigger post-release-dockerfile "$APP" "$IMAGE_TAG" } diff --git a/plugins/builder-herokuish/builder-release b/plugins/builder-herokuish/builder-release index 762b5f619..f7b552e14 100755 --- a/plugins/builder-herokuish/builder-release +++ b/plugins/builder-herokuish/builder-release @@ -36,6 +36,8 @@ trigger-builder-herokuish-builder-release() { "$DOCKER_BIN" container commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null fi + + echo "FROM $IMAGE" | docker build --label=com.dokku.image-stage=release -t "$IMAGE" - plugn trigger post-release-buildpack "$APP" "$IMAGE_TAG" } From 9d3785147e866a1ab0d11f64a95d9a0a93449b01 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 18 Feb 2020 01:32:41 -0500 Subject: [PATCH 2/6] docs: cleanup post-release-* trigger documentation --- docs/development/plugin-triggers.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index 5c90f8dee..77fe0945e 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -971,6 +971,8 @@ haproxy-build-config "$APP" ### `post-release-buildpack` +> Warning: Image mutation in this trigger may result in an invalid run state, and is heavily discouraged. + - Description: Allows you to run commands after environment variables are set for the release step of the deploy. Only applies to apps using buildpacks. - Invoked by: `internal function dokku_release() (release phase)` - Arguments: `$APP $IMAGE_TAG` @@ -978,27 +980,19 @@ haproxy-build-config "$APP" ```shell #!/usr/bin/env bash -# Installs a package specified by the `CONTAINER_PACKAGE` env var set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" APP="$1"; IMAGE_TAG="$2"; IMAGE=$(get_app_image_name $APP $IMAGE_TAG) verify_app_name "$APP" -dokku_log_info1 "Installing $CONTAINER_PACKAGE..." - -CMD="cat > gm && \ - dpkg -s CONTAINER_PACKAGE >/dev/null 2>&1 || \ - (apt-get update && apt-get install -y CONTAINER_PACKAGE && apt-get clean)" - -CID=$(docker run $DOKKU_GLOBAL_RUN_ARGS -i -a stdin $IMAGE /bin/bash -c "$CMD") -test $(docker wait $CID) -eq 0 -DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") -docker commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" $CID $IMAGE >/dev/null +# TODO ``` ### `post-release-dockerfile` +> Warning: Image mutation in this trigger may result in an invalid run state, and is heavily discouraged. + - Description: Allows you to run commands after environment variables are set for the release step of the deploy. Only applies to apps using a dockerfile. - Invoked by: `internal function dokku_release() (release phase)` - Arguments: `$APP $IMAGE_TAG` @@ -1183,9 +1177,9 @@ CMD="cat > gm && \ dpkg -s graphicsmagick >/dev/null 2>&1 || \ (apt-get update && apt-get install -y graphicsmagick && apt-get clean)" -CID=$(docker run "${DOCKER_COMMIT_LABEL_ARGS[@]}" -i -a stdin $IMAGE /bin/bash -c "$CMD") -DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") +CID=$(docker run $DOKKU_GLOBAL_RUN_ARGS -i -a stdin $IMAGE /bin/bash -c "$CMD") test $(docker wait $CID) -eq 0 +DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") docker commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" $CID $IMAGE >/dev/null ``` From 11e9cd13ae423a788f5b490eeb634af6be472861 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 18 Feb 2020 01:33:05 -0500 Subject: [PATCH 3/6] chore: drop com.dokku.network label It isn't necessary, we know the network is the network... --- plugins/network/subcommands.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/network/subcommands.go b/plugins/network/subcommands.go index 81812431a..73c7417d9 100644 --- a/plugins/network/subcommands.go +++ b/plugins/network/subcommands.go @@ -19,8 +19,6 @@ func CommandCreate(networkName string) error { "create", "--attachable", "--label", - "com.dokku.network=true", - "--label", fmt.Sprintf("com.dokku.network-name=%v", networkName), networkName, }, " ")) From de84a038d2cd952c006e0c84faf11b114d85215a Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 18 Feb 2020 01:33:40 -0500 Subject: [PATCH 4/6] feat: inject a com.dokku.dyno label This is useful for external tools that monitor based on container labels. --- plugins/scheduler-docker-local/scheduler-deploy | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/scheduler-docker-local/scheduler-deploy b/plugins/scheduler-docker-local/scheduler-deploy index dbb439665..03c72c1c7 100755 --- a/plugins/scheduler-docker-local/scheduler-deploy +++ b/plugins/scheduler-docker-local/scheduler-deploy @@ -69,11 +69,12 @@ trigger-scheduler-docker-local-scheduler-deploy() { local port="" local ipaddr="" local DOKKU_CONTAINER_ID_FILE="$DOKKU_ROOT/$APP/CONTAINER.$PROC_TYPE.$CONTAINER_INDEX" + local DYNO="$PROC_TYPE.$CONTAINER_INDEX" # start the app local DOCKER_ARGS DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG" "$PROC_TYPE" "$CONTAINER_INDEX") - DOCKER_ARGS+=" -e DYNO=$PROC_TYPE.$CONTAINER_INDEX " + DOCKER_ARGS+=" -e DYNO=$DYNO " DOCKER_ARGS+=$(: | plugn trigger docker-args-process-deploy "$APP" "$IMAGE_SOURCE_TYPE" "$IMAGE_TAG" "$PROC_TYPE" "$CONTAINER_INDEX") [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" -e TRACE=true " @@ -98,16 +99,16 @@ trigger-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_BIN" container create --label=com.dokku.container-type=deploy --label=com.dokku.process-type=$PROC_TYPE "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS --init --env PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + cid=$("$DOCKER_BIN" container create --label=com.dokku.container-type=deploy --label=com.dokku.process-type=$PROC_TYPE --label=com.dokku.dyno=$DYNO "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS --init --env PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) else # shellcheck disable=SC2086 - cid=$("$DOCKER_BIN" container create --label=com.dokku.container-type=deploy --label=com.dokku.process-type=$PROC_TYPE "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS --init $DOKKU_DOCKER_PORT_ARGS --env PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + cid=$("$DOCKER_BIN" container create --label=com.dokku.container-type=deploy --label=com.dokku.process-type=$PROC_TYPE --label=com.dokku.dyno=$DYNO "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS --init $DOKKU_DOCKER_PORT_ARGS --env 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_BIN" container create --label=com.dokku.container-type=deploy --label=com.dokku.process-type=$PROC_TYPE "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS --init "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + cid=$("$DOCKER_BIN" container create --label=com.dokku.container-type=deploy --label=com.dokku.process-type=$PROC_TYPE --label=com.dokku.dyno=$DYNO "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS --init "${ARG_ARRAY[@]}" $IMAGE $START_CMD) fi plugn trigger post-container-create "app" "$cid" "$APP" "deploy" "$PROC_TYPE" From 00f3d498a2e71f859dc77052a4203e598279a629 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 18 Feb 2020 05:43:45 -0500 Subject: [PATCH 5/6] fix: fetch app image before variable use --- plugins/builder-dockerfile/builder-release | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/builder-dockerfile/builder-release b/plugins/builder-dockerfile/builder-release index 8f3ac4cbc..3906e904a 100755 --- a/plugins/builder-dockerfile/builder-release +++ b/plugins/builder-dockerfile/builder-release @@ -13,6 +13,8 @@ trigger-builder-dockerfile-builder-release() { # buildstep plugins don't necessarily make sense for dockerfiles. call the new breed!!! plugn trigger pre-release-dockerfile "$APP" "$IMAGE_TAG" + + local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") echo "FROM $IMAGE" | docker build --label=com.dokku.image-stage=release -t "$IMAGE" - plugn trigger post-release-dockerfile "$APP" "$IMAGE_TAG" } From 93080498f6167bae87256de6c74cfb2dc96a25a7 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 18 Feb 2020 23:05:44 -0500 Subject: [PATCH 6/6] fix: correct calls to docker build and import common functions --- plugins/builder-dockerfile/builder-release | 3 ++- plugins/builder-herokuish/builder-release | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/builder-dockerfile/builder-release b/plugins/builder-dockerfile/builder-release index 3906e904a..5ef84ad14 100755 --- a/plugins/builder-dockerfile/builder-release +++ b/plugins/builder-dockerfile/builder-release @@ -1,6 +1,7 @@ #!/usr/bin/env bash set -eo pipefail [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" trigger-builder-dockerfile-builder-release() { declare desc="builder-dockerfile builder-release plugin trigger" @@ -15,7 +16,7 @@ trigger-builder-dockerfile-builder-release() { plugn trigger pre-release-dockerfile "$APP" "$IMAGE_TAG" local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") - echo "FROM $IMAGE" | docker build --label=com.dokku.image-stage=release -t "$IMAGE" - + echo "FROM $IMAGE" | "$DOCKER_BIN" image build --label=com.dokku.image-stage=release -t "$IMAGE" - plugn trigger post-release-dockerfile "$APP" "$IMAGE_TAG" } diff --git a/plugins/builder-herokuish/builder-release b/plugins/builder-herokuish/builder-release index f7b552e14..b371d186c 100755 --- a/plugins/builder-herokuish/builder-release +++ b/plugins/builder-herokuish/builder-release @@ -1,6 +1,7 @@ #!/usr/bin/env bash set -eo pipefail [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" trigger-builder-herokuish-builder-release() { @@ -37,7 +38,7 @@ trigger-builder-herokuish-builder-release() { "$DOCKER_BIN" container commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null fi - echo "FROM $IMAGE" | docker build --label=com.dokku.image-stage=release -t "$IMAGE" - + echo "FROM $IMAGE" | "$DOCKER_BIN" image build --label=com.dokku.image-stage=release -t "$IMAGE" - plugn trigger post-release-buildpack "$APP" "$IMAGE_TAG" }