go不从容器写入文件,除非应用程序手动从容器启动



我编写了一个小的golang应用程序。它做两件事:

  • 处理http://localhost: 5000
  • 每秒钟写一个日志

该应用程序位于docker容器中。你看到的记录器是我的,只是一个练习。应用程序开始。如果我卷曲http://localhost:5000,我就能看到"再见,世界!"但是记录器没有启动。奇怪的是,如果我进入容器,手动运行应用程序。日志记录器开始记录日志。我想这可能是权限的问题。

这里是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。去文件

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"]

这是由于在运行程序之前运行ListenAndServe造成的。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))
}

相关内容

  • 没有找到相关文章

最新更新