ファイル構成
ターミナル
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
.png)
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がないと言われたのでコピー先を見直したら解決した。