Go

DockerでGoの開発環境を構築する【最小限のコード】

DockerでGoの開発環境を構築する【最小限のコード】
DockerでGoが動作する環境を作りたいけど、どうすればいいか見当もつかない。。

この記事は、こういった方向け。

DockerでGoの開発環境を作る方法をお伝えします。

 

この記事を読めば、最小限のコードでDockerを使ったGoの開発環境構築ができるようになります。

 

少しでもこれからGoやDockerの勉強をしようと思っている方の参考になれば幸いです。

DockerでGoの開発環境を構築する【最小限のコード】

まずは、任意のディレクトリを作成し、その下に以下の構成でファイルを配置してください。

 

Dockerfile・docker-compose.yaml・main.goのそれぞれのファイルの中身を簡単に説明していきます。

 

[Dockerfile]

FROM golang:1.14.1-alpine

 

FROMにはDocker Hubの公式イメージを指定します。

 

今回はAlpineベースのイメージを使用しました。

理由はAlpineベースのイメージは余計なものが入っておらず、非常に軽量に動作するからです。(まあ、今回の実装程度ならどんなイメージでも変わらないですが。。)

 

Alpineベースイメージの軽量さは公式でも以下のように紹介されています。

Alpine Linux is much smaller than most distribution base images (~5MB), and thus leads to much slimmer images in general.

「Alpineは他のLinuxディストリビューションと比べて非常にサイズが小さいです。そのためとても軽量なイメージを構築できます」

引用:Docker Hub(Golang)

 

ちなみに、Alpineベースのイメージは軽量性を追求しているため、GitやVim等の(オプション)ツールは入っていません。

これらをインストールしたい場合は以下のようにapkコマンドでインストールする必要があります。

FROM golang:1.14.1-alpine

RUN apk update && apk add \
    git

 

apk updateで利用可能なパッケージのインデックス(リスト)を最新化し、apk addで指定したパッケージの追加をしています。(今回はGitを追加しました)

 

もしくは、以下のようなコマンドでもインストール可能です。

FROM golang:1.14.1-alpine

RUN apk --update-cache add \
    git

 

「apk update = –update-cache」ですね。

ちなみに、こちらの記事によると–updateというオプションは存在しないらしいので注意しましょう。

 

さらに以下の実装だと、ダウンロードしたパッケージリストのキャッシュが削除されるため、よりイメージを軽量にすることができます。

FROM golang:1.14.1-alpine

RUN apk --update-cache --no-cache add \
    git

 

 

[docker-compose.yaml]

version: "3"
services:
  go:
    build: ./build
    tty: true
    volumes:
      - type: bind
        source: "./cmd"
        target: "/go/src/app"
    working_dir: /go/src/app

 

buildには、Dockerfileが配置してあるディレクトリを指定します。

 

tty: trueはコンテナを起動させ続ける(永続化させる)ために必要な設定です。

これがないとbuildしてもコンテナはすぐに停止してしまうので注意しましょう。

ttyの意味や役割については、こちらの記事が参考になります。

簡単にいうと、tty: trueによりコンテナに仮装端末(ターミナル)が作成され、そのプロセスが実行され続けることでコンテナが正常終了するのを防ぐことができます。

※フォアグラウンドで実行するプロセスが無い場合、Dockerコンテナは立ち上げてもすぐに正常終了します

 

volumesではローカルのファイルとコンテナ内のファイルを同期させています。

 

working_dirではコンテナに入った際のデフォルトのディレクトリを指定します。

これにより、コンテナを立ち上げたコンテナに入った際に/go/src/appディレクトリから作業を開始することができます。

 

[main.go]

package main

import "fmt"

func main() {
	fmt.Println("Hello Go!")
}

 

“Hello Go!”を出力するGoの簡単プログラムです。

 

 

ファイルを作成したら、早速コンテナを立ち上げてみましょう。

docker-compsoe up -d

 

docker-compose psでstateがUpになっていたらOKです。

 

コンテナが立ち上がったら、コンテナに入りましょう。

以下のコマンドでコンテナ内に入ることができます。

docker-compose exec go ash

 

ポイントはシェルにashを指定している点です。

bashだと入れないので注意して下さい。

参考:dockerでalpine linux ベースのcontainerに入って、shellを使いたいとき。

ちなみにshでも入れます

 

コンテナ内に入れたらGoのコードを実行してみましょう。

以下のコマンドで実行できます。

go run main.go

 

“Hello Go!”が出力されたらOKです。

 

DockerでGoの開発環境を構築する【まとめ】

今回は、最小限のコードでDockerを使ってGoの開発環境を構築する方法をご紹介しました。

最後に、環境構築に必要なコードを再掲しておきます。

[Dockerfile]

FROM golang:1.14.1-alpine

 

[docker-compose.yaml]

version: "3"
services:
  go:
    build: ./build
    tty: true
    volumes:
      - type: bind
        source: "./cmd"
        target: "/go/src/app"
    working_dir: /go/src/app

 

[main.go]

package main

import "fmt"

func main() {
	fmt.Println("Hello Go!")
}

 

 

タイトルにもある通り、この記事の環境はあくまで「最小限」です。

本格的な開発をする際には必ず足りない部分が出てきます。

 

そのため、あくまでこの記事のコードは「ベース」と捉えた上で、必要に応じてカスタマイズして頂けるとありがたいです。

 

最後まで読んでいただきありがとうございました。

当記事がDockerを用いたGoの環境構築をする上で少しでも参考になっていれば幸いです。

 

関連記事:Laravel開発環境をDockerを使ってサクッと構築する【最小限のコード】

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA