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

Go言語
Go言語 プログラミング

ファイル構成

ターミナル
 tree
.
├── Dockerfile
├── docker-compose.yml
└── src
    └── main.go

Go環境を作る

ファイルの準備

Dockerfile

あらかじめ用意されたコンテナイメージに対して実行するコマンドを記載する。docker buildを実行すると、コマンドライン命令を自動化した処理を行い、ビルド結果としてイメージが得られる。

Dockerfile
# goバージョン
FROM golang:1.16.3-alpine
# アップデートとgitのインストール!!
RUN apk add --update &&  apk add git

# ワーキングディレクトリの設定
WORKDIR /go/src
COPY ./src /go/src

docker-compose.yml

アプリで使用するサービスの構成を決める。

buildの設定でcontextとDockerfileを設定している。

docker-compose.yml
version: "3"
services:
  web:
    build: .
    ports:
      - 8080:8080
    volumes:
      - ./src:/go/src
    tty: true

main.go

src/main.go
package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

イメージをビルド

ターミナル
docker-compose build

docker imagesで確認するとイメージが作成されている。

ターミナル
docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
docker_go_web   latest              082254eebf91        16 minutes ago      316MB

コンテナを立ち上げ、main.goを実行する

サービスの起動

ターミナル
docker-compose up -d

動作確認

main.goを実行し、"Hello world"が表示されることを確認。

ターミナル
docker-compose exec web go run main.go
Hello world

Webサーバーの起動

main.goの書き換え

main.go
package main

import (
	"net/http"

	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()
	e.GET("/", index)
	e.Logger.Fatal(e.Start(":8080"))
}

func index(c echo.Context) error {
	return c.String(http.StatusOK, "Hello, World!!!")
}

パッケージ管理

ターミナル
go mod init $(basename `pwd`)
ターミナル
go mod tidy

go.modとgo.sumが作成される

Dockerfileに追記

Dockerfile
# goバージョン
FROM golang:1.16.3-alpine
# アップデートとgitのインストール!!
RUN apk add --update &&  apk add git

#===== 追記 ここから =====#
COPY go.mod /go.mod
COPY go.sum /go.sum 
RUN go mod download
#===== 追記 ここまで =====#

# ワーキングディレクトリの設定
WORKDIR /go/src
COPY ./src /go/src

#===== 1行追記 =====#
CMD ["go", "run", "main.go"]

イメージのビルドとサーバーの起動

イメージのビルド

ターミナル
docker-compose build

サービスの起動

ターミナル
docker-compose up -d

localhost:8080を確認する。

困った時はログを見る

ターミナル
docker-compose logs

出会ったエラー

ターミナル
web_1  | main.go:6:2: no required module provides package github.com/labstack/echo: go.mod file not found in current directory or any parent directory; see 'go help modules'

g.modがないと言われたのでコピー先を見直したら解決した。

参考にさせていただいたページ

タイトルとURLをコピーしました