---
title: Cloud Native Buildpacks Tutorial - 3.3. ┗ gcr.io/paketo-buildpacks/builder:full-cf BuilderでGolangアプリのOCIイメージを作成
tags: ["Cloud Native Buildpacks Tutorial", "Cloud Native Buildpacks", "Paketo", "Series"]
categories: ["Dev", "Infrastructure", "CloudNativeBuildpacks", "Paketo"]
date: 2020-04-28T08:59:09Z
updated: 2020-05-11T03:32:01Z
---

`gcr.io/paketo-buildpacks/builder:full-cf`でGolangのアプリケーションのOCIイメージを作成します。

BuilderとStackを予めpullしておいてください。

```
docker pull gcr.io/paketo-buildpacks/builder:full-cf
docker pull gcr.io/paketo-buildpacks/run:full-cnb-cf
```

次のコマンドで"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:full-cf
```

> 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/go1.13.9.linux-amd64-cflinuxfs3-42e2eee8.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 (9c9519214ec9):
[exporter]       index.docker.io/making/pack-golang:latest
[exporter] Adding cache layer 'paketo-buildpacks/go-compiler:42e2eee8543a98b2cf57035aade9b53f20cd7214861bb8ddf50953b097f8bfc6'
[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              9c9519214ec9        40 years ago        1.06GB
```

使用されるBuildpackは同じですが、ベースイメージのサイズが大きいため、`gcr.io/paketo-buildpacks/builder:base`でビルドした場合に比べてイメージサイズが大きいです。

`pack inspect-image`でイメージを解析します。

```
$ pack inspect-image making/pack-golang
Inspecting image: making/pack-golang

REMOTE:
(not present)

LOCAL:

Stack: org.cloudfoundry.stacks.cflinuxfs3

Base Image:
  Reference: 30c2fe64f46f987d570fddf1a9400c0e0f58eebe790f95557b9387e5dcfb08a2
  Top Layer: sha256:70227f7df5ee235dae16d7b6ce4a23b03bb57cadd64a00740d590fb11bbae042

Run Images:
  gcr.io/paketo-buildpacks/run:full-cnb-cf

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
```
