docker - Go 应用程序在 Docker 中挂起

标签 docker go kubernetes google-cloud-platform

我有一个非常简单的 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 的调用只是挂起。

最佳答案

如果其他人遇到同样的问题,我可以使用 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:我知道这篇文章很旧,但我几乎错过了解决方案,所以我想帮助其他可能在 future 遇到这个问题的人。

关于docker - Go 应用程序在 Docker 中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50162302/

相关文章:

docker - 公开在gitlab ci docker镜像中运行的服务器

docker - Docker Compose入门指南

go - 微服务无法使用 Docker for Mac 进行通信

amazon-web-services - 将IAM组添加到AWS EKS中的aws-auth配置映射

docker - 无法向主机公开端口 80 以外的 docker 容器端口

go - BigQuery 中的数据库设计

c++ - 加载C++库时出现“ undefined symbol ”

pointers - 返回类型与 struct golang 相同

kubernetes RBAC 角色动词执行到 pod

docker - AWS KCL 在 docker 中捕获关闭信号