Help us understand the problem. What is going on with this article?

Go言語の環境をDockerで構築

More than 1 year has passed since last update.

学習履歴

はじめに

今の現場では、Django + Docker を使ったシステム開発を行っている。

仕事の幅を広げるため、Go 言語の習得に励んでいるが、Go 言語は Python 以上に環境構築が難しい印象を受ている。

ローカルの環境でモジュールを go get でインストールしたにも関わらず、いざプログラムを実行してみると、モジュールがありません、みたいなエラーになったりする。

環境構築が煩わしいので、Docker を使って Go 言語の環境構築を勉強してみることにした。

今回は、その第一弾。

必要な環境

docker が動く環境であれば、たぶんどこでも ok
(windows 以外で動作を確認した)

Dockerfile

Dockerfile を作成する。

Dockerfile
# golang のイメージを取得
FROM golang:1.9.2

# ソースのコピー先
ENV SRC_DIR=/go/src/github.com/gouser

# コンパイルしたファイルの格納場所
ENV GOBIN=/go/bin

# RUN, や ENTRYPOINT などを実行するワークディレクトリを指定
WORKDIR $GOBIN

# ソースをコピーする
ADD . $SRC_DIR

# コンパイル
RUN cd /go/src;
RUN go install github.com/gouser/;

# プログラム実行
ENTRYPOINT ["./gouser"]

# 8080 ポートを解放
EXPOSE 8080

docker-compose.yml

次は、docker-compose.yml を作成する。

この程度の規模なら必要ないだろうが、筆者は、docker-compose up でプログラムを実行できたほうが楽であるため、作成する。

docker-compose.yml
# ymlのバージョン
version: '3'

# コンテナサービスを指定
services:
  # golang(任意の名前)のサービスを作成
    golang:
        # 同一フォルダにある Dockerfile をビルドする
        build: .
    # 外部と接続する(外部ポート:dockerポート)
        ports:
            - "8080:8080"
        # コンテナ名を指定(任意の名前)
        container_name: mohohewo

main.go

動作確認のため、Go 言語で簡単なプログラムを作成する。

main.go
package main

import (
        "fmt"
        "log"
        "net/http"
        "text/template"
)

type Person struct {
        Id string
        Name string
}

// HTML テンプレートを読み込む関数
func readerTemplate(w http.ResponseWriter, r *http.Request) {

        person := Person{Id: "1", Name: "Mohohewo"}

        // docker 上にコピーしたtemplateファイルを指定する(ファイルは、後で作成する)
        parsedTemplate, err := template.ParseFiles("/go/src/github.com/gouser/templates/template.html")
        if err != nil {
                log.Fatalf("Not found file: %v", err)
        }
     // テンプレートに Person の値を渡す
        err = parsedTemplate.Execute(w, person)
        if err != nil {
                log.Printf("Error occurred while executing the template or writing its output: %v", err)
                return
        }
}

func main() {
        fmt.Println("API Server Start ... ")
        // ハンドラー登録
        http.HandleFunc("/", readerTemplate)
        // localhost:8080 で動くようにする
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
                log.Fatal("error starting http server: ", err)
                return
        }
}

ブラウザか Curl で、localhost:8080 にアクセスすると Person の値を HTML テンプレートに渡して、
それを表示するプログラムだ。

template.html

最後に template.html を作成する。

mkdir templates
touch templates/template.html
template.html
<html>
<head>
  <title>GO! GO! GO!</title>
</head>
  <body>
    <h1>Hello {{.Name}}</h1>
    Your ID is {{.Id}}
  </body>
</html>

Django みたいに {{ ."StructName" }} のように指定すると値がを表示できる。

フォルダ構成

最終的に、フォルダ構成は以下のようになる。

L Dockerfile
L docker-compose.yml
L main.go
L templates
   L template.html

プログラム実行

下記のコマンドで、プログラムを実行する。

# 起動
docker-compose up

mohohewo  | API Server Start ...

起動に失敗したらエラーが吐かれるので、エラーを修正後、ビルドしなおしてからプログラムを実行する。

docker-compose build

docker-compose up

docker が立ち上がったら、ブラウザ上で確認する。

img.png

まとめ

Docker を使えば、Go 言語でもスムーズに環境構築を行えた。

次は、DB と連携したい。

__init__
PythonとGo言語が一番好きです。どちらも仕事で使っています!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした