I have this golang sandbox project: https://github.com/cflynn07/golang-db-gateway-example
When I try to run gateway/gateway.go
inside a golang:1.6.0-alpine
~/g/s/g/c/golang-db-gateway-example git:master ❯❯❯ docker-compose up gateway
mysql_server is up-to-date
Starting gateway
Attaching to gateway
gateway | gateway.go:7:2: cannot find package "github.com/go-sql-driver/mysql" in any of:
gateway | /usr/local/go/src/github.com/go-sql-driver/mysql (from $GOROOT)
gateway | /go/src/github.com/go-sql-driver/mysql (from $GOPATH)
gateway | gateway.go:8:2: cannot find package "github.com/gorilla/mux" in any of:
gateway | /usr/local/go/src/github.com/gorilla/mux (from $GOROOT)
gateway | /go/src/github.com/gorilla/mux (from $GOPATH)
gateway exited with code 1
Why isn't the build step detecting my project's dependencies inside the /example/vendor
folder?
When I run go run gateway/gateway.go
from my host OS, the command works.
Directory structure (mounted inside container at /example)
~/g/s/g/c/golang-db-gateway-example git:master ❯❯❯ tree -L 3
.
├── README.md
├── client
│ └── client.go
├── docker-compose.yml
├── gateway
│ └── gateway.go
├── glide.lock
├── glide.yaml
├── tmp
└── vendor
└── github.com
├── go-sql-driver
└── gorilla
Relevant files:
docker-compose.yml
mysql:
container_name: mysql_server
image: mysql:5.7.11
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306
gateway:
container_name: gateway
image: golang:1.6.0-alpine
volumes:
- ./:/example
working_dir: /example/gateway
command: go run gateway.go
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=sandbox
links:
- mysql
gateway/gateway.go
package main
import (
"database/sql"
"encoding/json"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
"net/http"
"os"
)
var db *sql.DB
func main() {
r := mux.NewRouter()
var e error
db, e = sql.Open(
"mysql", os.ExpandEnv("root:${MYSQL_SERVER_PASSWORD}@mysql_server:3306/${MYSQL_DATABASE}"))
fmt.Print("error is", e)
r.HandleFunc("/todos", getTodos).Methods("GET")
http.ListenAndServe(":8080", r)
fmt.Printf("gateway")
}
type todo struct{}
func getTodos(w http.ResponseWriter, r *http.Request) {
t := new(todo)
s, _ := json.Marshal(t)
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
fmt.Fprint(w, string(s))
}
Update 1 I changed my data-volume mount path inside the container to mount the project under the containers $GOPATH
mysql:
container_name: mysql_server
image: mysql:5.7.11
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306
gateway:
container_name: gateway
image: golang:1.6.0-alpine
volumes:
- ./:/go/src/github.com/cflynn07/golang-db-gateway-example
working_dir: /go/src/github.com/cflynn07/golang-db-gateway-example
command: go run gateway/gateway.go
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=sandbox
links:
- mysql
However now docker appears to hang:
~/g/s/g/c/golang-db-gateway-example git:master ❯❯❯ docker-compose up gateway ✱
mysql_server is up-to-date
Recreating gateway
Attaching to gateway