環境
- Go 1.13
- MySQL 5.7
- docker-compose 3
docker-composeファイル
完成したdocker-compose
ファイルが下記になります。
version: '3'
services:
backend:
build:
context: .
dockerfile: "Dockerfile.dev"
volumes:
- ./:/go/src/github.com/test/go-src
ports:
- "8080:8080"
depends_on:
- db
environment:
- DATABASE_HOST=db
- DATABASE_PASSWORD=hogehoge
- DATABASE=dev
- DATABASE_USERNAME=root
tty: true
stdin_open: true
db:
image: mysql:5.7
restart: always
volumes:
- ./db/mysql/my.cnf:/etc/mysql/conf.d/my.cnf # mysqlの設定
environment:
MYSQL_ROOT_PASSWORD: hogehoge # 初期で設定されるパスワード
MYSQL_DATABASE: dev # docker-compose構築時に作成されるデータベース
ports:
- "3400:3306" # ローカルのMySQLのportと被らないように設定する
細かいところを下記より見ていきたいと思います。
Docker環境でのMySQLの環境変数
docker環境でのMySQLでは環境変数を準備してくれています。
それを使用することで、簡単にMySQLの環境も構築することができます。
Supported tags and respective Dockerfile links
主に使用するのは、下記3つかなと思います。
MYSQL_ROOT_PASSWORD
パスワードを設定
MYSQL_DATABASE
docker起動時に作成するデータベース名を設定
MYSQL_ALLOW_EMPTY_PASSWORD
パスワードを空にする設定
docker-compose でMySQL環境簡単構築
docker-composeでmysql使うとき初回起動時に複数のDBを作る方法
Hostの指定
DATABASE_HOST
に関しては、どうやって指定しようか悩みましたが、
docker-composeを立ち上げる時に、全てのサービス間にリンクされる仕様になっているようです。
Go側の環境変数にMySQL側のservice名(上記だとdb
)を指定すると接続できるようになりました。
version2ではcomposeファイルに書かれた全てのサービス間に自動的にリンクを張る仕様になったため、linksとわざわざ書く必要がなくなったそうです。depends_onで繋げたとしても、[サービス名]や[エイリアス名]で接続できます。
docker-compose depends_onとlinksの違い
Docker Compose - docker-compose.yml リファレンス
my.cnf
my.cnfに関しては、下記記事を参考にしました。
特にこの記事では触れません。
MacにMySQL5.7をインストール。開発用my.cnfも公開
MySQLパフォーマンスチューニング -my.cnfの見直し-
my.cnf についてまとめた
MySQL 5.7 インストールと設定メモ
MySQLのログに出力されるタイムスタンプがおかしい件
GoのDockerfile
ローカル開発環境用のDockerfileは下記のように作成しました。
FROM golang:1.13
WORKDIR /go/src/github.com/test/go-src
ADD . /go/src/github.com/test/go-src
ENV GO111MODULE=on
RUN go get github.com/pilu/fresh && \
go get github.com/jinzhu/gorm/dialects/mysql && \
go get -v github.com/rubenv/sql-migrate/...
EXPOSE 8080
CMD ["fresh"]
ホットリロード
docker-compose環境でも、ホットリロードできるようにfresh
を使用しています。
その際には、volumes
を設定する必要があります。
Golang + Nuxt.js + Kubernetes でWebサービスを作る - その①
Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活
volumes:
- ./:/go/src/github.com/test/go-src
Docker、ボリューム(Volume)について真面目に調べた
docker-compose基礎コマンド
下記などを参考にしました。
docker-compose コマンドまとめ
docker-compose コマンド概要
docker compose version3
version3のリファレンスは下記が参考になります。
Compose file version3のリファレンス
マイグレーション
方針として、docker-compose up
コマンド後に、マイグレーションを実施していきます。
現状だとsql-migrate
を使用しているので、これwとdockerコマンドを組み合わせていきます。
下記コマンドでマイグレーションを実施できます。
docker exec -it [コンテナID] sql-migrate up --env=container
環境の指定
docker用にGoからDBに接続するためのyamlを作成しました。
datasource: root:hogehoge@tcp(db:3306)/dev?parseTime=true
がキモになっており、ユーザー名:パスワード(Host:Port)/DB名の順になっています。
container:
dialect: mysql
datasource: root:hogehoge@tcp(db:3306)/dev?parseTime=true
dir: db/migrations
table: migrations
Seed管理
マイグレーションが終了したので、Seedデータを投入していきます。
下記コマンドを実行すればSeedデータが投入されるはず。
docker exec -it [コンテナID] mysql -u root -p dev -e"$(cat db/seed/seed.sql)"
db/seed/seed.sql
は、sqlファイルがあるところを指定してください。
Docker MySQL公式イメージを使用してDBに初期データを流し込む
Dockerコンテナ内に入らずにMySQL公式コンテナの中にSQL等を実行するメモ