You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:45:04