「Goプログラミング実践入門」のコードを実行するためにDocker環境を構築したった

commits4 min read読了の目安(約4200字

はじめに

いま、Sau Sheong Changの「Goプログラミング実践入門」って本を読んでる。GoでWebの開発したい人向け。すごく良い本。
素朴なHTMLファイルとCSSだけのWEBと、Ruby on Railsみたいなフレームワーク使ったブラックボックスなWEBとの間の技術的な理解をGo言語を使って埋めてくれる。Go言語のパッケージもブラックボックスではあるけども、かなり理解が深まる。

Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る (impress top gear) | Sau Sheong Chang, 武舎広幸, 阿部和也, 上西昌弘 |本 | 通販 | Amazon

第二章まで、さらっと読んで、実行環境、どうしようか少し考えてたけど、まじめにコードをforkして、今風にDocker環境作って試すことにした。go modも使うことにした。
少し試行錯誤したので、結果をまとめておく。
環境構築でつまづいてる人の参考になれば幸い。


第二章のサンプルコードを実行するとこんな感じ

概要

ファイルの階層はこんな感じ。golangのコンテナとdbのコンテナはわけた。goとpostgresqlの両方が入ってるイメージ使っても良いのかもやけど、実際に使うときのことを考えると分けるほうが自然かなと思った。

~/p/goweb ❯❯❯ tree -L 2
.
├── Makefile
├── db
│   ├── Dockerfile
│   └── data
├── docker-compose.yml
└── web
    ├── Dockerfile
    └── gowebprog

Makefileあるけど、これしか書いてない。最近、docker-composeじゃなくてdocker composeでいけるようになったらしい。最近でもないのか。

init:
	docker compose up -d --build

Docker

こんな感じ。必要十分な設定かは自信ない。うごいてるから、まあいいか。
ローカルな開発環境を前提に書いてる。

githubの環境変数とかは.zshrcに書いてるのを見に行ってる。

docker-compose.yml

version: '3'
services:
  web:
    build: ./web
    tty: true
    container_name: goweb
    environment:
      GITHUB_USER_NAME: ${GITHUB_USER_NAME}
      GITHUB_TOKEN: ${GITHUB_TOKEN}
      GITHUB_EMAIL: ${GITHUB_EMAL}
      DB_HOST: db
      DB_PORT: 5432
    volumes:
      - "./web:/root"
  db:
    build:
      context: ./db
      args:
        - DB_LANG=ja_JP
    tty: true
    container_name: goweb-db
    environment:
      POSTGRES_USER: root
      POSTGRES_HOST_AUTH_METHOD: trust
    volumes:
      - "./db:/root"
    ports:
      - 5436:5432

Dockerfile @ web

むっちゃシンプル。なんとなくhomeでやりたい気持ちになったので、/rootにした。

FROM golang:latest
WORKDIR /root
ADD . /root

Dockerfile @ db

日本語の設定(必要なんやろか?)しようとしたら、こんなエラーが出た。
initdb: error: invalid locale settings; check LANG and LC_* environment variables jp

この記事のマネしたら動いた。localeのインストールもせなあかんぽい。最初から日本語入ってるイメージも探せばあるのかも。
PostgreSQL を Docker 環境で日本語ロケールで動作させる - Qiita

FROM postgres:latest
ARG DB_LANG=en_US
RUN localedef -i $DB_LANG -c -f UTF-8 -A /usr/share/locale/locale.alias $DB_LANG.UTF-8
ENV LANG $DB_LANG.utf8

他に参考にしたところ

Running Go applications using Docker Compose in GoLand | The GoLand Blog
ロケール(locale)まとめ - Qiita
DockerComposeでGoのGinとMySqlの環境を作ってみた-第1弾 | w2ソリューション株式会社 TECH Media

コード

ここをForkした。日本語ありがたや。
サイズでかい。まだ二章までしか読んでないけど、その後なにがあるのか???
mushahiroyuki/gowebprog: Goプログラミング実践入門 例題

修正

postgresへの接続

hostを追加した。

ここ参考にした。
Go database/sql の操作ガイドあったんかい

ch02/chitchat/data/data.go
-       Db, err = sql.Open("postgres", "dbname=chitchat sslmode=disable")
+       Db, err = sql.Open("postgres", "host=db dbname=chitchat sslmode=disable")

githubのパス

importする先をフォークした自分のリポジトリに変更した。

"github.com/xxx/gowebprog/ch02/chitchat/data"

実行手順

db

dbコンテナにdata/setup.sqlだけ準備した。

createdb chitchat
psql -f data/setup.sql -d chitchat

DBのクライアントツールで確認して動いてそうなことをみた。

web

webコンテナではこんな感じ。

git clone github.com/xxx/gowebprog
(コードを修正)
go mod init github.com/xxx/gowebprog/tree/master/ch02/chitchat
go mod tidy
go build
./chitchat

ブラウザ

http://localhost:8080/にアクセスしたらつながった。
登録してログインしたら入って動いた。すばらしい。


見た目はこんな感じ

以上。

おわりに

環境構築、それっぽくできてよかった。
第三章以降も読みすすめるの楽しみ。