我寫了一個小 golang 應用程序。它做兩件事:處理 http://localhost:5000每秒寫一個日志此應用程序位于 docker 容器內。你可以看到的記錄器是我的,只是一個練習。申請開始。如果我 curl http://localhost:5000 我可以看到“Ciao,mondo!”。但是記錄器沒有啟動。奇怪的是,如果我進入容器,我手動運行應用程序。記錄器開始記錄。我認為這可能是權限問題。這里是 docker-compose。version: "3.9"services: app: container_name: 'go_docker_app' build: dockerfile: Dockerfile context: . volumes: - ./logs:/app/logs - .:/opt/app/api ports: - "5000:5000"這里是 main.go 文件package mainimport ( "fmt" "net/http" "time" "github.com/sensorario/gol")func main() { http.HandleFunc("/", HelloServer); http.ListenAndServe(":5000", nil); go forever() select{}}func HelloServer(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Ciao, mondo!");}func forever() { l := gol.NewCustomLogger("/app"); for { l.Info(fmt.Sprintf("%v+\n", time.Now())); time.Sleep(time.Second) }}這里是 Dockerfile我嘗試了更多解決方案。例如從 Dockerfile 創建 logger.log。我不認為是權限問題,因為我沒有錯誤。FROM golang:1.17-alpineRUN mkdir -p /app/logsADD . /appWORKDIR /appRUN go get -d -v ./...RUN go install -v ./...RUN go build -o /applicationEXPOSE 5000RUN touch /app/logs/logger.logCMD ["/application"]
1 回答

大話西游666
TA貢獻1817條經驗 獲得超14個贊
這是由于ListenAndServe
在你的 goroutine 之前運行引起的。go forever()
從不執行,所以它不會輸出任何日志文件。
奇怪的是,如果我進入容器,我手動運行應用程序。記錄器開始記錄。
我假設您在運行容器上執行,您的應用程序的一個實例已經在運行,因此端口 5000已經被占用。您沒有任何錯誤處理,因此它會跳過它并轉到forever()
函數。select{}
不需要空,因為ListenAndServe
會“阻止”程序:一個很好的解釋https://stackoverflow.com/a/44598343/14484111
func main() {
go forever()
http.HandleFunc("/", HelloServer);
// added error validating
err := http.ListenAndServe(":5000", nil);
log.Fatal(err)
// or shorter version
// log.Fatal(http.ListenAndServe(":5000", nil))
}
- 1 回答
- 0 關注
- 91 瀏覽
添加回答
舉報
0/150
提交
取消