最終更新: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が実行できました。
次