【问题标题】:Mux Router doesn't work in Dockerized golang project多路复用路由器在 Dockerized golang 项目中不起作用
【发布时间】:2021-10-18 13:33:07
【问题描述】:

我在本地进行了测试,它在我的本地运行良好。 我可以从 POST、GET 方法中获得响应。

但是当我将应用程序 dockerize 并尝试测试相同的端点时,我什么也得不到。 我已经尝试了 Stackoverflow 中的所有建议。因此,我将粘贴我的 Dockerfile 和 Makefile 以征求您的意见。

我的 Dockerfile:

FROM golang:1.16.5 AS build-env

RUN set -x \
    && apt-get update -y \
    && apt-get install -y locales \
                          make \
                          xz-utils \
                          zip \
    && rm -rf /var/lib/apt/lists/*

FROM build-env AS builder
WORKDIR /build
COPY . .
RUN set -x \
    && make

FROM debian:buster AS runner

RUN set -x \
    && apt-get update -y \
    && apt-get install -y ca-certificates \
    && rm -rf /var/lib/apt/lists/* \
    && update-ca-certificates

COPY --from=builder /build/bin/* .
CMD ["./applicaitonx"]

还有我的 Makefile:

build:
    go build -o bin/applicaitonx -v -buildmode=exe .

为了能够构建 docker,我使用以下命令;

docker build -t app .

然后我运行它。

我看到应用程序正在运行,并且 listenandserve 根本没有抛出错误。但是 mux 根本没有路由。 它说它在听,但它没有。 main.go下面的部分我也复制一下

srv := &http.Server{
    Handler: router,
    Addr: ":" + os.Getenv("PORT"),
}

if err := srv.ListenAndServe(); err != nil {
    log.Fatal("ListenAndServe: ", err)
}

我检查了所有环境变量,所以os.GetEnv("PORT") 不会返回 null。我很确定。 我写了一些调试 cmets,据我所知,代码甚至没有调试 cmets。所以它根本不打印任何东西。

【问题讨论】:

  • 你怎么称呼那个端点?
  • 我只是使用 Postman 来完成,但我的套接字挂断了。我什至尝试使用 curl 但从服务器得到空响应。当我查看日志时,我发现它没有命中调试 cmets。多路复用器根本不起作用。
  • curl -v 在您的端点上报告什么?
  • 你调用的 URL 是什么?
  • 能否请您也附上 docker image run 命令,我认为端口映射没有到位,因此您可能无法访问应用程序?

标签: docker rest go gorilla mux


【解决方案1】:

您在容器内使用的端口可能未暴露于外部世界,因此您无法访问它们。尝试添加-p 标志,如下所示:

docker run -p P1:P2

P1 = TCP 端口

P2 = 容器端口

请参考:this doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多