我寫了一個小的 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 main
import (
"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-alpine
RUN mkdir -p /app/logs
ADD . /app
WORKDIR /app
RUN go get -d -v ./...
RUN go install -v ./...
RUN go build -o /application
EXPOSE 5000
RUN touch /app/logs/logger.log
CMD ["/application"]
uj5u.com熱心網友回復:
它是由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))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338476.html
上一篇:在golang中退出stuts1
下一篇:GoLang空結構體構建
