本篇要教大家如何部署 Go 語言的 App 到 now.sh 服務。now 服務是讓開發者可以透過 JavaScript 或用 Docker 方式直接部署到 now 雲端機器,也就是 now 所提供的服務可以在自己電腦透過
package.json
或 Dockerfile
來部署 app。原先剛出來時候,只有支援 node.js 部署,後來才增加 Docker。透過 Docker 就可以來部署各種不同語言的專案。
事前準備
請先下載 now-cli 工具,直接到 Release 頁面找到相對應的執行檔。下載後丟到/usr/local/bin
或新增到 $PATH
變數底下。
Go 語言
請直接在專案內建立server.go
package main import ( "flag" "time" "github.com/gin-gonic/gin" ) func rootHandler(context *gin.Context) { currentTime := time.Now() currentTime.Format("20060102150405") context.JSON(200, gin.H{ "current_time": currentTime, "text": "Hello World", }) } // GetMainEngine is default router engine using gin framework. func GetMainEngine() *gin.Engine { r := gin.New() r.GET("/", rootHandler) return r } // RunHTTPServer List 8000 default port. func RunHTTPServer() error { port := flag.String("port", "8000", "The port for the mock server to listen to") // Parse all flag flag.Parse() err := GetMainEngine().Run(":" + *port) return err } func main() { RunHTTPServer() }存檔後,請直接透過
go run
進行測試。
撰寫 Dockerfile
接著要寫 Dockerfile 來進行編譯及測試FROM golang:1.9-alpine3.6 MAINTAINER Bo-Yi Wu <appleboy.tw@gmail.com> ADD . /go/src/github.com/appleboy/go-hello RUN go install github.com/appleboy/go-hello EXPOSE 8000 CMD ["/go/bin/go-hello"]請修改
github.com/appleboy/go-hello
路徑,接著透過底下指令來編譯 Docker,注意 EXPOSE 8000
代表需要將 docker 內的 8000 對外。
$ docker build -t appleboy/go-hello -f Dockerfile .編譯成功後,使用 docker run 執行
$ docker run -p 8080:8000 appleboy/go-hello [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET / --> main.rootHandler (1 handlers) [GIN-debug] Listening and serving HTTP on :8000你可以發現成功執行了 app。
部署到 Now.sh
在第一個步驟安裝好 now-cli 指令,請直接在專案目錄內下now
,就可以發現系統會自動上傳該專案目錄底下所有檔案。有些檔案是不需要上傳的話,請使用 .dockerignore
來自動忽略,node.js 則是透過 .npmignore
。如果沒有發現 .dockerignore
及 .npmignore
則是檢查 .gitignore
檔案。
Demo 網站
Now.sh 缺陷
部署慢
不確定是不是在台灣的關係,在家裡部署到 now.sh,檔案大小不到 5MB 要部署 30 分鐘以上。蠻久的。免費方案
免費方案單一上傳檔案不能超過 1MB,這對於寫 Go 語言的,不能先編譯出 binary 然後再進行 Docker 包裝來說相當不方便。變成需要將檔案全部丟到 now.sh 再進行編譯,部署體驗就會變得不是很好。無法指定 Dockerfile 名稱
現在只支援專案目錄底下的Dockerfile
,假設今天把檔名換成 Dockerfile.now
這樣是無法讀取的,command 也沒有參數讓開發者修正。
.dockerignore 無作用
如果在.dockerignore
寫入
* !bin/ !config/可以發現加上
--debug
模式後,config 內的檔案沒有上傳到 now.sh,造成編譯失敗。