Go应用在Docker容器内无法自动写日志 手动启动则正常
问题根因
你的main函数执行顺序存在逻辑错误:http.ListenAndServe()是阻塞调用,只要HTTP服务正常启动没有抛出异常,就永远不会向下执行后续代码,因此负责写日志的forever协程根本没有被创建启动。
你进入容器手动运行应用时日志正常,大概率是你手动运行的是本地修改后重新编译的正确版本二进制,而容器默认启动用的是你之前构建的旧镜像里的/application文件,代码顺序还没修正。
修复方案
第一步:调整main.go代码顺序
先启动日志协程,再启动阻塞的HTTP服务,同时建议增加错误捕获逻辑:
package main import ( "fmt" "log" "net/http" "time" "github.com/sensorario/gol" ) func main() { http.HandleFunc("/", HelloServer) // 先启动日志协程 go forever() // 再启动HTTP服务,增加错误日志输出 log.Fatal(http.ListenAndServe(":5000", nil)) } 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) } }
第二步:重新构建镜像启动容器
修改代码后需要重新构建镜像,避免容器使用旧的缓存镜像:
docker-compose up --build
可选优化
你当前docker-compose.yml中挂载的.:/opt/app/api卷没有实际作用,你的应用工作目录为/app,可以删掉这个无用挂载避免后续文件混淆。
内容的提问来源于stack exchange,提问作者sensorario
相关产品推荐
相关产品推荐

