登录
首页 >  Golang >  Go问答

应用程序必须从容器手动启动才能向容器写入文件

来源:stackoverflow

时间:2024-02-24 16:54:26 345浏览 收藏

哈喽!今天心血来潮给大家带来了《应用程序必须从容器手动启动才能向容器写入文件》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

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

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

该应用程序位于 docker 容器内。你看到的记录器是我的,只是一个练习。申请开始。如果我卷曲 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"]

正确答案


这是由于在 goroutine 之前运行 listenandserve 造成的。 goforever()永远不会执行,因此不会输出任何日志文件。

奇怪的是,如果我进入容器,然后手动运行应用程序。记录器开始记录。

我假设您在正在运行的容器上执行,其中您的应用程序的一个实例已经在运行,因此端口 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))

}

好了,本文到此结束,带大家了解了《应用程序必须从容器手动启动才能向容器写入文件》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>