From bc464c7cb899325783e8a0fccb8ae84080aa2654 Mon Sep 17 00:00:00 2001 From: Manuel de Brito Fontes Date: Wed, 13 Sep 2017 20:04:20 -0300 Subject: [PATCH] Add example for nginx custom error pages --- images/custom-error-pages/Makefile | 110 ++++++++++++++++++ images/custom-error-pages/README.md | 2 + images/custom-error-pages/main.go | 94 +++++++++++++++ images/custom-error-pages/rootfs/Dockerfile | 21 ++++ images/custom-error-pages/rootfs/www/404.html | 1 + images/custom-error-pages/rootfs/www/404.json | 1 + images/custom-error-pages/rootfs/www/4xx.html | 1 + images/custom-error-pages/rootfs/www/4xx.json | 1 + images/custom-error-pages/rootfs/www/500.html | 1 + images/custom-error-pages/rootfs/www/500.json | 1 + images/custom-error-pages/rootfs/www/5xx.html | 1 + images/custom-error-pages/rootfs/www/5xx.json | 1 + 12 files changed, 235 insertions(+) create mode 100644 images/custom-error-pages/Makefile create mode 100644 images/custom-error-pages/README.md create mode 100644 images/custom-error-pages/main.go create mode 100755 images/custom-error-pages/rootfs/Dockerfile create mode 100644 images/custom-error-pages/rootfs/www/404.html create mode 100644 images/custom-error-pages/rootfs/www/404.json create mode 100644 images/custom-error-pages/rootfs/www/4xx.html create mode 100644 images/custom-error-pages/rootfs/www/4xx.json create mode 100644 images/custom-error-pages/rootfs/www/500.html create mode 100644 images/custom-error-pages/rootfs/www/500.json create mode 100644 images/custom-error-pages/rootfs/www/5xx.html create mode 100644 images/custom-error-pages/rootfs/www/5xx.json diff --git a/images/custom-error-pages/Makefile b/images/custom-error-pages/Makefile new file mode 100644 index 000000000..96b3d3479 --- /dev/null +++ b/images/custom-error-pages/Makefile @@ -0,0 +1,110 @@ +all: push + +BUILDTAGS= + +# Use the 0.0 tag for testing, it shouldn't clobber any release builds +TAG?=0.1 +REGISTRY?=aledbf +GOOS?=linux +DOCKER?=gcloud docker -- +SED_I?=sed -i +GOHOSTOS ?= $(shell go env GOHOSTOS) + +PKG=k8s.io/ingress/images/custom-error-pages + +ifeq ($(GOHOSTOS),darwin) + SED_I=sed -i '' +endif + +REPO_INFO=$(shell git config --get remote.origin.url) + +ifndef COMMIT + COMMIT := git-$(shell git rev-parse --short HEAD) +endif + +ARCH ?= $(shell go env GOARCH) +GOARCH = ${ARCH} +DUMB_ARCH = ${ARCH} + +BASEIMAGE?=alpine:3.6 + +ALL_ARCH = amd64 arm arm64 ppc64le + +QEMUVERSION=v2.9.1 + +IMGNAME = custom-error-pages +IMAGE = $(REGISTRY)/$(IMGNAME) +MULTI_ARCH_IMG = $(IMAGE)-$(ARCH) + +ifeq ($(ARCH),arm) + QEMUARCH=arm + GOARCH=arm +endif +ifeq ($(ARCH),arm64) + QEMUARCH=aarch64 +endif +ifeq ($(ARCH),ppc64le) + QEMUARCH=ppc64le + GOARCH=ppc64le +endif +#ifeq ($(ARCH),s390x) +# QEMUARCH=s390x +#endif + +TEMP_DIR := $(shell mktemp -d) + +DOCKERFILE := $(TEMP_DIR)/rootfs/Dockerfile + +all: all-container + +sub-container-%: + $(MAKE) ARCH=$* build container + +sub-push-%: + $(MAKE) ARCH=$* push + +all-container: $(addprefix sub-container-,$(ALL_ARCH)) + +all-push: $(addprefix sub-push-,$(ALL_ARCH)) + +container: .container-$(ARCH) +.container-$(ARCH): + cp -r ./* $(TEMP_DIR) + $(SED_I) 's|BASEIMAGE|$(BASEIMAGE)|g' $(DOCKERFILE) + $(SED_I) "s|QEMUARCH|$(QEMUARCH)|g" $(DOCKERFILE) + +ifeq ($(ARCH),amd64) + # When building "normally" for amd64, remove the whole line, it has no part in the amd64 image + $(SED_I) "/CROSS_BUILD_/d" $(DOCKERFILE) +else + # When cross-building, only the placeholder "CROSS_BUILD_" should be removed + # Register /usr/bin/qemu-ARCH-static as the handler for ARM binaries in the kernel + $(DOCKER) run --rm --privileged multiarch/qemu-user-static:register --reset + curl -sSL https://github.com/multiarch/qemu-user-static/releases/download/$(QEMUVERSION)/x86_64_qemu-$(QEMUARCH)-static.tar.gz | tar -xz -C $(TEMP_DIR)/rootfs + $(SED_I) "s/CROSS_BUILD_//g" $(DOCKERFILE) +endif + + $(DOCKER) build -t $(MULTI_ARCH_IMG):$(TAG) $(TEMP_DIR)/rootfs + +ifeq ($(ARCH), amd64) + # This is for to maintain the backward compatibility + $(DOCKER) tag $(MULTI_ARCH_IMG):$(TAG) $(IMAGE):$(TAG) +endif + +push: .push-$(ARCH) +.push-$(ARCH): + $(DOCKER) push $(MULTI_ARCH_IMG):$(TAG) +ifeq ($(ARCH), amd64) + $(DOCKER) push $(IMAGE):$(TAG) +endif + +clean: + $(DOCKER) rmi -f $(MULTI_ARCH_IMG):$(TAG) || true + +build: clean + CGO_ENABLED=0 GOOS=${GOOS} GOARCH=${GOARCH} go build -a -installsuffix cgo \ + -ldflags "-s -w" \ + -o ${TEMP_DIR}/rootfs/custom-error-pages ${PKG}/... + +release: all-container all-push + echo "done" diff --git a/images/custom-error-pages/README.md b/images/custom-error-pages/README.md new file mode 100644 index 000000000..3ee67e5d9 --- /dev/null +++ b/images/custom-error-pages/README.md @@ -0,0 +1,2 @@ + +Example of Custom error pages for the NGINX Ingress controller diff --git a/images/custom-error-pages/main.go b/images/custom-error-pages/main.go new file mode 100644 index 000000000..88b709b6c --- /dev/null +++ b/images/custom-error-pages/main.go @@ -0,0 +1,94 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "io" + "log" + "mime" + "net/http" + "os" + "strconv" +) + +const ( + FormatHeader = "X-Format" + + CodeHeader = "X-Code" + + ContentType = "Content-Type" +) + +func main() { + path := "/www" + if os.Getenv("PATH") != "" { + path = os.Getenv("PATH") + } + http.HandleFunc("/", errorHandler(path)) + http.ListenAndServe(fmt.Sprintf(":8080"), nil) +} + +func errorHandler(path string) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + ext := "html" + + format := r.Header.Get(FormatHeader) + if format == "" { + format = "text/html" + log.Printf("forma not specified. Using %v\n", format) + } + + mediaType, _, _ := mime.ParseMediaType(format) + cext, err := mime.ExtensionsByType(mediaType) + if err != nil { + log.Printf("unexpected error reading media type extension: %v. Using %v\n", err, ext) + } else { + ext = cext[0] + } + w.Header().Set(ContentType, format) + + errCode := r.Header.Get(CodeHeader) + code, err := strconv.Atoi(errCode) + if err != nil { + code = 404 + log.Printf("unexpected error reading return code: %v. Using %v\n", err, code) + } + w.WriteHeader(code) + + file := fmt.Sprintf("%v/%v%v", path, code, ext) + f, err := os.Open(file) + if err != nil { + log.Printf("unexpected error opening file: %v\n", err) + scode := strconv.Itoa(code) + file := fmt.Sprintf("%v/%cxx%v", path, scode[0], ext) + f, err := os.Open(file) + if err != nil { + log.Printf("unexpected error opening file: %v\n", err) + http.NotFound(w, r) + return + } + defer f.Close() + log.Printf("serving custom error response for code %v and format %v from file %v\n", code, format, file) + io.Copy(w, f) + return + } + defer f.Close() + log.Printf("serving custom error response for code %v and format %v from file %v\n", code, format, file) + io.Copy(w, f) + } +} diff --git a/images/custom-error-pages/rootfs/Dockerfile b/images/custom-error-pages/rootfs/Dockerfile new file mode 100755 index 000000000..aaf60efb1 --- /dev/null +++ b/images/custom-error-pages/rootfs/Dockerfile @@ -0,0 +1,21 @@ +# Copyright 2017 The Kubernetes Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM BASEIMAGE + +CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/ + +COPY . / + +CMD ["/custom-error-pages"] diff --git a/images/custom-error-pages/rootfs/www/404.html b/images/custom-error-pages/rootfs/www/404.html new file mode 100644 index 000000000..0f00f93f5 --- /dev/null +++ b/images/custom-error-pages/rootfs/www/404.html @@ -0,0 +1 @@ +The page you're looking for could not be found. \ No newline at end of file diff --git a/images/custom-error-pages/rootfs/www/404.json b/images/custom-error-pages/rootfs/www/404.json new file mode 100644 index 000000000..36f3e753e --- /dev/null +++ b/images/custom-error-pages/rootfs/www/404.json @@ -0,0 +1 @@ +{ "message": "The page you're looking for could not be found" } \ No newline at end of file diff --git a/images/custom-error-pages/rootfs/www/4xx.html b/images/custom-error-pages/rootfs/www/4xx.html new file mode 100644 index 000000000..05ba01769 --- /dev/null +++ b/images/custom-error-pages/rootfs/www/4xx.html @@ -0,0 +1 @@ +4xx html \ No newline at end of file diff --git a/images/custom-error-pages/rootfs/www/4xx.json b/images/custom-error-pages/rootfs/www/4xx.json new file mode 100644 index 000000000..48246d04e --- /dev/null +++ b/images/custom-error-pages/rootfs/www/4xx.json @@ -0,0 +1 @@ +4xx json \ No newline at end of file diff --git a/images/custom-error-pages/rootfs/www/500.html b/images/custom-error-pages/rootfs/www/500.html new file mode 100644 index 000000000..68d7a7b52 --- /dev/null +++ b/images/custom-error-pages/rootfs/www/500.html @@ -0,0 +1 @@ +500 html \ No newline at end of file diff --git a/images/custom-error-pages/rootfs/www/500.json b/images/custom-error-pages/rootfs/www/500.json new file mode 100644 index 000000000..9cad530c1 --- /dev/null +++ b/images/custom-error-pages/rootfs/www/500.json @@ -0,0 +1 @@ +500 json \ No newline at end of file diff --git a/images/custom-error-pages/rootfs/www/5xx.html b/images/custom-error-pages/rootfs/www/5xx.html new file mode 100644 index 000000000..1bcb87780 --- /dev/null +++ b/images/custom-error-pages/rootfs/www/5xx.html @@ -0,0 +1 @@ +5xx html \ No newline at end of file diff --git a/images/custom-error-pages/rootfs/www/5xx.json b/images/custom-error-pages/rootfs/www/5xx.json new file mode 100644 index 000000000..4703b68c6 --- /dev/null +++ b/images/custom-error-pages/rootfs/www/5xx.json @@ -0,0 +1 @@ +5xx json \ No newline at end of file