「Goプログラミング実践入門」のコードを実行するためにDocker環境を構築したった
はじめに
いま、Sau Sheong Changの「Goプログラミング実践入門」って本を読んでる。GoでWebの開発したい人向け。すごく良い本。
素朴なHTMLファイルとCSSだけのWEBと、Ruby on Railsみたいなフレームワーク使ったブラックボックスなWEBとの間の技術的な理解をGo言語を使って埋めてくれる。Go言語のパッケージもブラックボックスではあるけども、かなり理解が深まる。
第二章まで、さらっと読んで、実行環境、どうしようか少し考えてたけど、まじめにコードを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 の操作ガイドあったんかい
- 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/
にアクセスしたらつながった。
登録
してログイン
したら入って動いた。すばらしい。
見た目はこんな感じ
以上。
おわりに
環境構築、それっぽくできてよかった。
第三章以降も読みすすめるの楽しみ。
Discussion