GoアプリケーションのDockerfileを作る
GoアプリケーションのDockerfileを作成してみました。 Docker公式にマニュアルがあるので、そのままの内容になりますが、作成後のコンテナの中身を覗いてみたりしたので、その点含めてメモに残しておきます。
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 build
、docker 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の作成はデバッグが難しいので、ある程度ファイルを記述している段階からコンテナの中身を想像できないと苦しいので、シンプルな例で今回確認をしてみました。
以上です。