From b6b6a55059371c57210c421831d7393f13411f41 Mon Sep 17 00:00:00 2001
From: Jason Hall lpP@QNk8#j;!nX6
docker pull kontain.me/random:latest serves an image containing
+
random.kontain.medocker pull random.kontain.me/random:latest serves an image containing
random data. By default the image contains one layer containing 10 MB of random
bytes. You can request a specific size and shape of random image. For example,
kontain.me/random:4x100 generates a random image of 4 layers of
100 random bytes each.
+
kontain.medocker pull kontain.me/ko/[import path] serves an image
containing a Go binary fetched using go get and built into a
container image using ko. For example,
+ href="https://github.com/google/ko">ko.
For example,
docker pull kontain.me/ko/github.com/google/ko/cmd/ko will fetch,
build and (eventually) serve a Docker image containing ko itself.
Koception!
cnb.kontain.medocker pull cnb.kontain.me/[ghuser]/[ghrepo]:[revision] serves
+an image fetched from source on GitHub and built using CNCF Buildpacks.
For example, docker pull
+ cnb.kontain.me/buildpack/sample-java-app:b032838 fetches, builds
+and serves a sample Java
+ app.
The registry does not accept pushes and does not handle requests for images by digest. This is a silly hack and probably isn't stable. Don't rely on it for anything serious. It could probably do a lot of smart things to be a lot diff --git a/cmd/ko/main.go b/cmd/ko/main.go index 17d070a..5bd0e0e 100644 --- a/cmd/ko/main.go +++ b/cmd/ko/main.go @@ -20,8 +20,6 @@ import ( "log" "net/http" "os" - "regexp" - "strconv" "strings" "time" @@ -29,7 +27,6 @@ import ( "cloud.google.com/go/logging" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/random" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/ko/pkg/build" "github.com/imjasonh/kontain.me/pkg/run" @@ -77,12 +74,9 @@ func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // API Version check. w.Header().Set("Docker-Distribution-API-Version", "registry/2.0") return - case strings.HasPrefix(path, "random/manifests/"): - s.serveRandomManifest(w, r) case strings.HasPrefix(path, "ko/") && strings.Contains(path, "/manifests/"): s.serveKoManifest(w, r) - case strings.HasPrefix(path, "random/blobs/"), - strings.HasPrefix(path, "ko/") && strings.Contains(path, "/blobs/"): + case strings.HasPrefix(path, "ko/") && strings.Contains(path, "/blobs/"): serve.Blob(w, r) default: serve.Error(w, serve.ErrNotFound) @@ -142,30 +136,3 @@ func (s *server) serveKoManifest(w http.ResponseWriter, r *http.Request) { } serve.Manifest(w, img) } - -// Capture up to 99 layers of up to 99.9MB each. -var randomTagRE = regexp.MustCompile("([0-9]{1,2})x([0-9]{1,8})") - -// konta.in/random:3x10mb -// konta.in/random(:latest) -> 1x10mb -func (s *server) serveRandomManifest(w http.ResponseWriter, r *http.Request) { - tag := strings.TrimPrefix(r.URL.Path, "/v2/random/manifests/") - var num, size int64 = 1, 10000000 // 10MB - - // Captured requested num + size from tag. - all := randomTagRE.FindStringSubmatch(tag) - if len(all) >= 3 { - num, _ = strconv.ParseInt(all[1], 10, 64) - size, _ = strconv.ParseInt(all[2], 10, 64) - } - s.info.Printf("generating random image with %d layers of %d bytes", num, size) - - // Generate a random image. - img, err := random.Image(size, num) - if err != nil { - s.error.Printf("ERROR (random.Image): %s", err) - serve.Error(w, err) - return - } - serve.Manifest(w, img) -} diff --git a/cmd/random/main.go b/cmd/random/main.go new file mode 100644 index 0000000..5453b80 --- /dev/null +++ b/cmd/random/main.go @@ -0,0 +1,95 @@ +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "os" + "regexp" + "strconv" + "strings" + + "cloud.google.com/go/compute/metadata" + "cloud.google.com/go/logging" + "github.com/google/go-containerregistry/pkg/v1/random" + "github.com/imjasonh/kontain.me/pkg/serve" +) + +func main() { + ctx := context.Background() + projectID, err := metadata.ProjectID() + if err != nil { + log.Fatalf("metadata.ProjectID: %v", err) + } + client, err := logging.NewClient(ctx, projectID) + if err != nil { + log.Fatalf("logging.NewClient: %v", err) + } + lg := client.Logger("server") + + http.Handle("/v2/", &server{ + info: lg.StandardLogger(logging.Info), + error: lg.StandardLogger(logging.Error), + }) + + log.Println("Starting...") + port := os.Getenv("PORT") + if port == "" { + port = "8080" + log.Printf("Defaulting to port %s", port) + } + log.Printf("Listening on port %s", port) + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil)) +} + +type server struct { + info, error *log.Logger +} + +func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + s.info.Println("handler:", r.Method, r.URL) + path := strings.TrimPrefix(r.URL.String(), "/v2/") + + switch { + case path == "": + // API Version check. + w.Header().Set("Docker-Distribution-API-Version", "registry/2.0") + return + case strings.Contains(path, "/manifests/"): + s.serveRandomManifest(w, r) + case strings.Contains(path, "/blobs/"): + serve.Blob(w, r) + default: + serve.Error(w, serve.ErrNotFound) + } +} + +// Capture up to 99 layers of up to 99.9MB each. +var randomTagRE = regexp.MustCompile("([0-9]{1,2})x([0-9]{1,8})") + +// random.kontain.me:3x10mb +// random.kontain.me(:latest) -> 1x10mb +func (s *server) serveRandomManifest(w http.ResponseWriter, r *http.Request) { + tag := strings.TrimPrefix(r.URL.Path, "/v2/manifests/") + var num, size int64 = 1, 10000000 // 10MB + + s.info.Println("TAG", tag) + + // Captured requested num + size from tag. + all := randomTagRE.FindStringSubmatch(tag) + if len(all) >= 3 { + num, _ = strconv.ParseInt(all[1], 10, 64) + size, _ = strconv.ParseInt(all[2], 10, 64) + } + s.info.Printf("generating random image with %d layers of %d bytes", num, size) + + // Generate a random image. + img, err := random.Image(size, num) + if err != nil { + s.error.Printf("ERROR (random.Image): %s", err) + serve.Error(w, err) + return + } + serve.Manifest(w, img) +} diff --git a/deploy.sh b/deploy.sh index 1f2f431..efae233 100755 --- a/deploy.sh +++ b/deploy.sh @@ -2,6 +2,13 @@ set -euxo pipefail +KO_DOCKER_REPO=gcr.io/kontainme ko publish -P ./cmd/random && \ +gcloud --project=kontainme beta run deploy random \ + --image=gcr.io/kontainme/github.com/imjasonh/kontain.me/cmd/random \ + --memory=2Gi \ + --concurrency=1 \ + --region=us-central1 + KO_DOCKER_REPO=gcr.io/kontainme ko publish -P ./cmd/ko && \ gcloud --project=kontainme beta run deploy app \ --image=gcr.io/kontainme/github.com/imjasonh/kontain.me/cmd/ko \ diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..87291f5 --- /dev/null +++ b/test.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -euxo pipefail + +docker pull random.kontain.me/random +docker pull random.kontain.me/random:8x80 + +docker pull kontain.me/ko/github.com/knative/build/cmd/controller + +docker pull cnb.kontain.me/buildpack/sample-java-app