【问题标题】:Go application hangs in DockerGo 应用程序在 Docker 中挂起
【发布时间】:2018-10-14 04:42:28
【问题描述】:

我有一个非常简单的 go 应用程序,可以在 Windows 和 Mac 下正常工作。 (顺便说一句,我是一个 golang 新手)。该应用程序的目的是订阅 google cloud pubsub 订阅并使用 REST 将消息转发到另一个应用程序。

代码如下:

func getOrCreateTopic() {
    log.Infof("1")
    ctx := context.Background()

    log.Infof("2")
    topicName := viper.GetString("gce.pubsub.topic")
    log.Infof("3")
    topic = client.Topic(topicName)
    log.Infof("4")
    exists, _ := topic.Exists(ctx)
    log.Infof("5")
    if topic == nil || !exists {
        topic, err = client.CreateTopic(ctx, topicName)
        if err != nil {
            log.Errorf("Failed to create topic %s: %v", topicName, err)
            os.Exit(2)
        }
    }
}

func main() {
    ...
    getOrCreateTopic();
    ...
}

我创建了一个 docker 容器并将其发布到我们在谷歌云中的 kubernetes 集群。我在日志中看到的是“4”之前的所有内容,然后仅此而已。但该进程仍显示为在 kubernetes 中运行。

我迷路了,似乎对 API 的调用刚刚挂起。

【问题讨论】:

标签: docker go kubernetes google-cloud-platform


【解决方案1】:

如果其他人遇到同样的问题,我可以使用 OP 中的链接解决它。但是,我第一次看到这个链接时就看过去了,因为它提到了使用云 pubsub 模拟器。

我没有在我的项目中使用 pubsub 模拟器,所以我继续阅读,直到我到达关于 SSL 证书的部分。 SSL证书的缺失是挂起功能的根本原因。

我在我的项目中使用scratch docker 映像,默认情况下不包含 ssl 证书。我能够通过在我的多阶段构建中从我的 golang 构建映像中复制 ssl 证书来解决挂起的代码。

FROM golang
COPY ./ /go/src/app
WORKDIR /go/src/app
RUN CGO_ENABLED=0 GOOS=linux go build -o /build/main

FROM scratch
COPY --from=0 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=0 /build/main /main
CMD ["/main"]

ps:我知道这篇文章已经过时了,但我差点错过了解决方案,所以我想帮助其他可能在未来遇到这个问题的人。

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 2013-08-23
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多