Cloud Native Buildpacks Tutorial - 2.4. ┗ gcr.io/paketo-buildpacks/builder:base BuilderでGolangアプリのOCIイメージを作成
gcr.io/paketo-buildpacks/builder:baseでGolangのアプリケーションのOCIイメージを作成します。
BuilderとStackを予めpullしておいてください。
docker pull gcr.io/paketo-buildpacks/builder:base
docker pull gcr.io/paketo-buildpacks/run:base-cnb
次のコマンドで"Hello World"アプリケーションを作成します。
cd ${GOPATH}/src
mkdir -p github.com/making/hello-golang
cd github.com/making/hello-golang
go mod init
cat <<'EOF' > main.go
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World!")
})
http.ListenAndServe(":8080", nil)
}
EOF
pack buildコマンドでイメージを作成します。
pack build making/pack-golang --no-pull --builder gcr.io/paketo-buildpacks/builder:base
BuilderとStackを事前にpullしていない場合は
--no-pullを外せば、ビルド時にBuilderとStackもpullしますが、ビルドが遅くなります。
次のようなログが出力されます。
===> DETECTING
[detector] paketo-buildpacks/go-compiler 0.0.112
[detector] paketo-buildpacks/go-mod 0.0.96
===> ANALYZING
[analyzer] Previous image with name "index.docker.io/making/pack-golang:latest" not found
===> RESTORING
===> BUILDING
[builder]
[builder] Go Compiler Buildpack 0.0.112
[builder] Go 1.13.9: Contributing to layer
[builder] Downloading from https://buildpacks.cloudfoundry.org/dependencies/go/go-1.13.9-bionic-61a279e8.tgz
[builder] Verifying checksum
[builder] Expanding to /layers/paketo-buildpacks_go-compiler/go
[builder]
[builder] Go Mod Buildpack 0.0.96
[builder] Setting environment variables
[builder] : Contributing to layer
[builder] github.com/making/hello-golang
[builder] : Contributing to layer
[builder] Running `go install`
[builder] : Contributing to layer
[builder] Contributing start command
[builder] Process types:
[builder] web: /layers/paketo-buildpacks_go-mod/app-binary/bin/hello-golang
===> EXPORTING
[exporter] Adding layer 'launcher'
[exporter] Adding layer 'paketo-buildpacks/go-mod:app-binary'
[exporter] Adding 1/1 app layer(s)
[exporter] Adding layer 'config'
[exporter] *** Images (d8970e079210):
[exporter] index.docker.io/making/pack-golang:latest
[exporter] Adding cache layer 'paketo-buildpacks/go-compiler:61a279e80c8d3a03ae9464dc2fc263e37e0655d45e9931693ea9522bfbb91847'
[exporter] Adding cache layer 'paketo-buildpacks/go-compiler:go'
[exporter] Adding cache layer 'paketo-buildpacks/go-mod:go-cache'
[exporter] Adding cache layer 'paketo-buildpacks/go-mod:go-mod'
Successfully built image making/pack-golang
pack build時に--publishオプションをつけると、Docker Registryでのpushを行います。事前にdocker loginが必要です。
作成したイメージをdocker runで起動します。
docker run --rm -p 8080:8080 making/pack-golang
アプリケーションにアクセスします。
$ curl localhost:8080 -w '\n'
Hello World!
Docker Imageのサイズを確認します。
$ docker images | grep making/pack-golang
making/pack-golang latest d8970e079210 40 years ago 82.8MB
pack inspect-imageでイメージを解析します。
$ pack inspect-image making/pack-golang
Inspecting image: making/pack-golang
REMOTE:
(not present)
LOCAL:
Stack: io.buildpacks.stacks.bionic
Base Image:
Reference: 40845d52d6fb6d285a320aeac821b61cff0e2863e0ff12e12138c4775aae1828
Top Layer: sha256:f0d87426c0a82340475d73a9108b063d3d3cfbd92ef3b4af74dcd8f904475a36
Run Images:
gcr.io/paketo-buildpacks/run:base-cnb
Buildpacks:
ID VERSION
paketo-buildpacks/go-compiler 0.0.112
paketo-buildpacks/go-mod 0.0.96
Processes:
TYPE SHELL COMMAND ARGS
web (default) bash /layers/paketo-buildpacks_go-mod/app-binary/bin/hello-golang
Golang Buildpackの細かい設定は https://github.com/paketo-buildpacks/go を確認してください。
おわったらDocker Imageを削除します。
docker rmi making/pack-golang