DockerでGoの開発環境を構築する

最終更新:2020/05/01


1. 環境

  • mac
  • Docker-desktop

2. dockerでgoの開発環境を構築する

Goの開発環境はdockerで構築します。

dockerを使うのは、

  • localマシンにGoをインストールするとlocal環境を汚染して他のアプリ等に影響が生じる可能性がある
  • Goで開発したアプリケーションはdockerコンテナで動かすことがオススメ

という理由です。

なので開発環境の構築築は、dockerの基礎知識が身についている前提で話を進めます。 また、そのまま利用しても結構です。

3. dockerファイルの作成

まずDockerfileを作成します。

FROM golang:1.14.2-alpine3.11 as marsa-go-development # Default to UTF-8 file.encoding ENV LANG C.UTF-8 ENV USERNAME marsa # for development only # git config --global http.sslVerify falseにしないとSSL制限に引っかかる RUN apk add --update-cache git ca-certificates tzdata make gcc g++ && git config --global http.sslVerify false && go get golang.org/x/tools/cmd/goimports && go get -u golang.org/x/lint/golint && go get golang.org/x/tools/gopls && go get -u github.com/kisielk/errcheck && go get -u github.com/golang/mock/mockgen && go get -u github.com/securego/gosec/cmd/gosec && go get -u github.com/google/wire/cmd/wire && go get -u github.com/fzipp/gocyclo # project root ARG PROJECT_ROOT=/go/src/github.com/java-lang-programming/marsa # コンテナ内に作業ディレクトリを作成 RUN mkdir -p ${PROJECT_ROOT} # コンテナログイン時のディレクトリ指定 WORKDIR ${PROJECT_ROOT} FROM alpine:3.11 COPY --from=marsa-go-development ${PROJECT_ROOT} ${PROJECT_ROOT} EXPOSE 8080

上記のDockerfileは、開発で役に立つライブラリを全てインストールするDockerfileです。

開発で導入するライブラリは以下です。

  • go fmt コードを整形します
  • go vet コードを静的解析します
  • go test テストコードを実行します
  • lint 微妙な構文をチェックします
  • errcheck エラーハンドリングしてない処理を抽出します
  • sec セキュリティに問題がソースコードがあるかどうかを検査します。
  • complexity コードの複雑度を計算します。(デフォルトは30)

4. docker-compose.yml作成

RDB等、他のサービスとの連携が楽にできるようdocker-composeを利用します。 docker-compose.ymlを用意します。

version: '3.7' services: golang-marsa: build: context: . dockerfile: ./development/Dockerfile target: marsa-go-development image: golang-marsa container_name: golang-marsa tty: true volumes: - .:/go/src/github.com/java-lang-programming/ ports: - 8094:8080

フォルダ構成は以下のようにします。

$ ls -l total 24 drwxr-xr-x 4 masayasuzuki staff 128 4 26 08:27 development -rw-r--r-- 1 masayasuzuki staff 313 4 26 08:28 docker-compose.yml

開発用のDockerfileはdevelopmentフォルダに格納します。 これは開発用と本番用のDockerfileの管理を別にするためです。

理由は、開発用Dockerfileと本番用のDockerfileは必要なライブラリがまるで異なるからです。 これについては、また詳しく説明します。

また、docker-compose.ymlでは、

tty: true

を設定してコンテナの中に入れるようにしておきます。

4. docker-composeの実行

Dockerfileとdocker-compose.ymlの設定が完了したら、docker-composeをビルドします。

cd create-development-environment $ docker-compose build

Successfully built 4b810736105cと

とterminalに出力されれば成功です。

docker-composeを実行してコンテナに入ります。

$ docker-compose up

terminalのタブを開きます。

$ docker exec -it golang-marsa /bin/sh

コンテナ内に入れます。

5. 動作確認

goが実行できることを確認します。

$ touch main.go

main.goにHello worldのコードを貼り付けます。

maim.goファイルを作成します。

package main import "fmt" func main() { fmt.Println("Hello, world") }

コードを実行します。

$ go run main.go Hello, world

main.goが実行できました。