3 回答

TA貢獻1875條經(jīng)驗 獲得超5個贊
實際上,您成功地運行了 Go 服務(wù)器。它沒有掛起,只是在等待連接。由于一些怪癖,沒有輸出:它沒有嘗試連接到數(shù)據(jù)庫,并且日志語句被緩沖。
嘗試修改 gateway.go main:
func main() {
log.Println("Starting main...")
conn := os.ExpandEnv("root:${MYSQL_SERVER_PASSWORD}@mysql_server:3306/${MYSQL_DATABASE}")
var err error
db, err = sql.Open("mysql", conn)
if err != nil {
log.Fatal(err)
}
log.Println("pinging", conn)
if err := db.Ping(); err != nil {
log.Fatal(err)
}
r := mux.NewRouter()
r.HandleFunc("/todos", getTodos).Methods("GET")
listen := ":8080"
log.Printf("Listening on %s\n", listen)
log.Fatal(http.ListenAndServe(listen, r))
}
運行這個版本給出:
$ docker-compose up gateway
mysql_server is up-to-date
Starting gateway
Attaching to gateway
gateway | 2016/03/15 10:58:05 Starting main...
gateway | 2016/03/15 10:58:05 pinging root:@mysql_server:3306/sandbox
gateway | 2016/03/15 10:58:05 default addr for network 'mysql_server:3306' unknown
gateway | exit status 1
gateway exited with code 1
你應(yīng)該很高興從那里出發(fā)。筆記:
docker-compose 似乎緩沖標準輸出直到換行
日志功能,例如 log.Print 添加換行符,fmt.Print 不會
sql.Open 不連接到數(shù)據(jù)庫,使用 sql.Ping (see wiki )
缺少 MYSQL_SERVER_PASSWORD
缺少 mysql 連接字符串的網(wǎng)絡(luò)類型(參見示例)
也啟動mysql服務(wù)器
需要創(chuàng)建新的或安裝現(xiàn)有的數(shù)據(jù)庫“沙箱”

TA貢獻1833條經(jīng)驗 獲得超4個贊
在我看來,這里的主要問題似乎是您沒有提前構(gòu)建 Go 程序??雌饋砟呀?jīng)將 Go 源文件放在 Docker 容器中,并且您依賴于go run構(gòu)建然后運行程序。
我想你能做到嗎?這是非常腳本語言風(fēng)格的方式。
但是,我認為最好的方法是提前構(gòu)建 Go 應(yīng)用程序。
(請注意,對于以下內(nèi)容,我改編了現(xiàn)有的 makefile 代碼,但實際上并沒有運行它。)
例如,您可以像這樣構(gòu)建它:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -installsuffix netgo -o ./gateway/gateway ./gateway
然后,假設(shè)您不需要該容器中的其他內(nèi)容,您可以使用 Dockerfile 構(gòu)建 Docker 映像,例如:
FROM scratch
ENTRYPOINT ["/gateway"]
ADD ./gateway/gateway /gateway
結(jié)果是一個簡單的、小的(大約 8 MB)容器,其中包含一個靜態(tài)鏈接的可執(zhí)行文件。

TA貢獻1812條經(jīng)驗 獲得超5個贊
首先 - 需要更改${MYSQL_SERVER_PASSWORD}
on ${MYSQL_ROOT_PASSWORD}
,因為環(huán)境只有MYSQL_ROOT_PASSWORD
變量。
其次 - 這是錯誤的@mysql_server:3306
,正確的是@tcp(mysql_server:3306)
能夠通過 TCP 連接到 MySQL。
conn := os.ExpandEnv("root:${MYSQL_ROOT_PASSWORD}@tcp(mysql_server:3306)/${MYSQL_DATABASE}")
一切都會好起來的,唯一的問題可能是數(shù)據(jù)庫初始化時需要在運行主程序之前暫停。有幾種方法可以解決這個問題,這里有幾種方法https://docs.docker.com/compose/startup-order/
- 3 回答
- 0 關(guān)注
- 250 瀏覽
添加回答
舉報