---
title: Cloud Native Buildpacks Tutorial - 5.3. ┗ heroku/buildpacks:18 BuilderでGolangアプリのOCIイメージを作成
tags: ["Cloud Native Buildpacks Tutorial", "Cloud Native Buildpacks", "Heroku", "Series"]
categories: ["Dev", "Infrastructure", "CloudNativeBuildpacks", "Heroku"]
date: 2020-04-28T10:11:45Z
updated: 2020-05-11T03:34:58Z
---

`heroku/buildpacks:18`でGolangのアプリケーションのOCIイメージを作成します。

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

```
docker pull heroku/buildpacks:18
docker pull heroku/pack:18
```

次のコマンドで"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 heroku/buildpacks:18
```

> BuilderとStackを事前にpullしていない場合は`--no-pull`を外せば、ビルド時にBuilderとStackもpullしますが、ビルドが遅くなります。

次のようなログが出力されます。

```
===> DETECTING
[detector] heroku/go       0.1.2
[detector] heroku/procfile 0.5
===> ANALYZING
[analyzer] Warning: Image "index.docker.io/making/pack-golang:latest" not found
===> RESTORING
===> BUILDING
[builder] -----> Fetching jq... done
[builder] -----> Fetching stdlib.sh.v8... done
[builder] -----> 
[builder]        Detected go modules via go.mod
[builder] -----> 
[builder]        Detected Module Name: github.com/making/hello-golang
[builder] -----> 
[builder]  !!    The go.mod file for this project does not specify a Go version
[builder]  !!    
[builder]  !!    Defaulting to go1.12.17
[builder]  !!    
[builder]  !!    For more details see: https://devcenter.heroku.com/articles/go-apps-with-modules#build-configuration
[builder]  !!    
[builder] -----> New Go Version, clearing old cache
[builder] -----> Installing go1.12.17
[builder] -----> Fetching go1.12.17.linux-amd64.tar.gz... done
[builder] -----> Determining packages to install
[builder]        
[builder]        Detected the following main packages to install:
[builder]        		github.com/making/hello-golang
[builder]        
[builder] -----> Running: go install -v -tags heroku github.com/making/hello-golang 
[builder] github.com/making/hello-golang
[builder]        
[builder]        Installed the following binaries:
[builder]        		./bin/hello-golang
[builder]        
[builder]        Created a Procfile with the following entries:
[builder]        		web: bin/hello-golang
[builder]        
[builder]        If these entries look incomplete or incorrect please create a Procfile with the required entries.
[builder]        See https://devcenter.heroku.com/articles/procfile for more details about Procfiles
[builder]        
[builder] -----> Discovering process types
[builder]        Procfile declares types     -> web
===> EXPORTING
[exporter] Adding layer 'launcher'
[exporter] Adding layer 'heroku/go:profile'
[exporter] Adding 1/1 app layer(s)
[exporter] Adding layer 'config'
[exporter] *** Images (2233c63b7edf):
[exporter]       index.docker.io/making/pack-golang:latest
[exporter] Adding cache layer 'heroku/go:shim'
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              2233c63b7edf        40 years ago        510MB
```

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

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

REMOTE:
(not present)

LOCAL:

Stack: heroku-18

Base Image:
  Reference: 60f9e03398de7d6a5268be95224246f05eed9f1eecb1fe7605753261f2bd871a
  Top Layer: sha256:ceefbd5b67bc32a9d87867c8c8d375675246e9db9b470cb95133b4e93429b113

Run Images:
  heroku/pack:18

Buildpacks:
  ID                     VERSION
  heroku/go              0.1.2
  heroku/procfile        0.5

Processes:
  TYPE                 SHELL        COMMAND                 ARGS
  web (default)        bash         bin/hello-golang   
```

おわったらDocker Imageを削除します。

```
docker rmi making/pack-golang
```
