症状
タイトルの通り。
解決策
こちらに見事なまでにおんなじ症状の方がいて、言われるがままにMySQLの接続情報を修正したところ無事直りました。以下Before/Afterです。
Before
docker-compose.yml
version: "3"
services:
app:
build: .
depends_on:
- db
volumes:
- ./:/go/src/app
ports:
- 3000:3000
environment:
MYSQL_DATABASE: go_app_dev
MYSQL_USER: docker
MYSQL_PASSWORD: password
db:
image: mysql:5.7
container_name: dockerMySQL
volumes:
- ./storage/mysql_data:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_DATABASE: go_app_dev
MYSQL_USER: docker
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
db/db.go
package db
import (
"fmt"
"os"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var (
db *gorm.DB
err error
)
func Init() {
user = os.Getenv("MySQL_USER")
pass = os.Getenv("MYSQL_PASSWORD")
dbname := os.Getenv("MYSQL_DATABASE")
connection := fmt.Sprintf("%s:%s@/%s?charset=utf8&parseTime=True&loc=Local", user, pass, dbname)
db, err := gorm.Open("mysql", connection)
if err != nil {
panic(err)
}
}
After
docker-compose.yml
version: "3"
services:
app:
build: .
depends_on:
- db
volumes:
- ./:/go/src/app
ports:
- 3000:3000
environment:
MYSQL_DATABASE: go_app_dev
MYSQL_HOST: dockerMySQL # 追加!!
MYSQL_USER: docker
MYSQL_PASSWORD: password
db:
image: mysql:5.7
container_name: dockerMySQL # 追加!!
volumes:
- ./storage/mysql_data:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_DATABASE: go_app_dev
MYSQL_USER: docker
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
db/db.go
// ...略
func Init() {
user = os.Getenv("MYSQL_USER")
pass = os.Getenv("MYSQL_PASSWORD")
host = os.Getenv("MYSQL_HOST") // ココ!!
dbname := os.Getenv("MYSQL_DATABASE")
connection := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", user, pass, host, dbname) // 修正!!
db, err := gorm.Open("mysql", connection)
if err != nil {
panic(err)
}
}
決め手はgorm.Openの第二引数で接続情報を指定する際に、MySQLを動かしているDockerコンテナのコンテナ名で接続するという点でした。docker-composeで起動しているコンテナ達はdocker networkを介して通信しているため、ネットワーク名の代わりにコンテナ名で接続することが可能であり、Afterに載せたような接続情報でappコンテナからdbコンテナに接続できるということらしいです。