1. y-u-t-a

    No comment

    y-u-t-a
Changes in body
Source | HTML | Preview
@@ -1,61 +1,63 @@
## 前提
- Docker がインストールされていること
## 手順
### Go ファイルを作成
`app.go` という名前のファイルを作成する。
`app.go` に「Hello, world」と出力するだけのコードを書く。
(ホストOS に Go がインストールされてなくても :ok_hand: )
```go:app.go
package main
import "fmt"
func main() {
fmt.Println("Hello, world")
}
```
### Dockerfile を作成
Go ファイルと同じディレクトリに `Dockerfile` を作成する。
「Go のバイナリを**ビルド**する環境」と「Go のバイナリを**実行**する環境」の定義を記述する。
```dockerfile:Dockerfile
# 「builder」という名前で Dockerfile 内から参照できるようにする
FROM golang:1.13 AS builder
WORKDIR /root
# 作成した Go ファイルをコピー
COPY . /root
# Linux 用のバイナリをビルドし、WORKDIR に出力
RUN GOOS=linux go build -o app .
# scratch は超軽量なイメージ
FROM scratch
WORKDIR /root
# 「builder」にあるバイナリを WORKDIR にコピー
COPY --from=builder /root/app .
CMD ["./app"]
```
### イメージをビルド & コンテナ起動
+Go ファイルと Dockerfile があるディレクトリでターミナルを起動し、イメージをビルド & コンテナ起動する。
+
```bash:terminal
# app という名前でイメージをビルド
docker build -t app .
# app のコンテナを起動( --rm はコンテナ停止時にコンテナを削除するオプション )
docker run --rm app
# app.go の実行結果が出力される
> Hello, world
# app のイメージサイズ ≒ バイナリのサイズ で「Go のバイナリを実行する環境」が実現できたことがわかる
docker images app --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
REPOSITORY TAG SIZE
app latest 2.01MB
```