GoアプリケーションのDockerfileを作る

GoアプリケーションのDockerfileを作成してみました。 Docker公式にマニュアルがあるので、そのままの内容になりますが、作成後のコンテナの中身を覗いてみたりしたので、その点含めてメモに残しておきます。

docs.docker.com

1. Goアプリケーションの作成

簡単なWebアプリケーションを用意します。

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    doMain()
}

func doMain() {
    r := gin.Default()
    r.GET("/", func(ctx *gin.Context) {
        ctx.JSON(200, gin.H{
            "msg": "hello world",
        })
    })
    r.Run(":8082")
}

実行してアクセスできることを確認しておきます。

# go run main.go
# curl htt://localhost:8082/
{"msg":"hello world"}

ディレクトリの内容は以下の通りです。

# ls
go.mod      go.sum      main.go

2. Dockerfileの作成

Dockerのリファレンスに従ってDockerfileを作成します。 作成場所は main.go と同じディレクトリにします。

FROM golang:1.16-alpine

WORKDIR /app

COPY go.mod ./
COPY go.sum ./

RUN go mod download

COPY ./ ./

RUN go build -o /main

EXPOSE 8082

CMD ["/main"]

3.Dockerfileをビルドしてコンテナを起動する

docker builddocker run を順に実行します。

# docker build -t golang-app:0.0.1 .
[+] Building 14.2s (12/12) FINISHED                                                                                                                                                    
 => [internal] load build definition from Dockerfile                                                                                                                              0.0s
 => => transferring dockerfile: 196B                                                                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                                                                 0.0s
 => => transferring context: 2B                                                                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/golang:1.16-alpine                                                                                                             0.0s
 => [1/7] FROM docker.io/library/golang:1.16-alpine                                                                                                                               0.0s
 => [internal] load build context                                                                                                                                                 0.0s
 => => transferring context: 269B                                                                                                                                                 0.0s
 => CACHED [2/7] WORKDIR /app                                                                                                                                                     0.0s
 => CACHED [3/7] COPY go.mod ./                                                                                                                                                   0.0s
 => [4/7] COPY go.sum ./                                                                                                                                                          0.0s
 => [5/7] RUN go mod download                                                                                                                                                     9.4s
 => [6/7] COPY ./ ./                                                                                                                                                              0.0s
 => [7/7] RUN go build -o /main                                                                                                                                                   3.2s
 => exporting to image                                                                                                                                                            1.6s
 => => exporting layers                                                                                                                                                           1.6s
 => => writing image sha256:57519ae8145d5801d04b2779ec08bfcee7024eeade47fb0f0eefe5e00da08164                                                                                      0.0s
 => => naming to docker.io/library/golang-app:0.0.1      
# docker run --name golang-app --rm -it -d -p 18082:8082 golang-app:0.0.1

http://localhost:18082/」にアクセスしてレスポンスが返ってきたらひとまず成功です。

4.コンテナの中身を覗いてみる。

作成したコンテナに入って中身を覗いてみます。

docker exec -it golang-app sh
/app # ls
Dockerfile  go.mod      go.sum      main.go
/app # ls /
app    bin    dev    etc    go     home   lib    main   media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var

コンテナに入るとWORKDIRに指定した app にいます。当該フォルダにgo関連のファイルが配置されています。 main の実行ファイルは go build -o /main としているので /main に存在しています。

Dockerfileの作成はデバッグが難しいので、ある程度ファイルを記述している段階からコンテナの中身を想像できないと苦しいので、シンプルな例で今回確認をしてみました。

以上です。