使用 echo 中间件在 docker-container 中为 golang 提供静态文件

问题描述 投票:0回答:1

所以。我有这样的结构:

应用程序 -api -模板 -例子 -html

像这样使用回声

e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
        Root:       "examples/html",
        Browse:     true,
        IgnoreBase: true,
    }))

当我在本地运行它时它完美无缺

但是当我把它放在 docker-container 中时 然后我在尝试获取页面的字体和其他参数时出错

2023-05-03T19:14:48Z ERR error="code=400, message=failed to parse page id: invalid UUID length: 16" environment=dev latency=0 method=GET path=/i/blocks/index.css query= version=v0.0.0

/i/ - 是 api 中的组路径 在本地它由 IgnoreBase 处理:上面的 middleware.StaticConfig 中的 true

在 docker 中不是这样

这是构建后的 docker 文件的一部分:

RUN go build myApp

FROM debian:buster

WORKDIR /app

COPY templates/ templates/
COPY examples/html/ examples/html/
COPY --from=build_stage /app/app-server /app/app-server

EXPOSE 8080

ENTRYPOINT [ "/app/app-server"]

其他一切都很完美,它可以看到模板,从中获取信息,但无法从 examples/html 中获取静态信息

P>S> 如果解决方案使用 go:embed 将是完美的,但只要让它正常运行就足够了)))

P>P>S> 有一个模板包含

<link rel="stylesheet" href="./blocks/index.css">
获取我调用 Get
http://localhost:8080/i/:id
的页面 通过中间件它应该调用
examples/html/blocks/index.css
但它调用了
/i/blocks/index.css

如上所述,当我在本地运行该应用程序时,它运行完美,但是当它在容器中时,它会因上述错误而失败,因为中间件不会像在本地运行时那样从路径中删除垃圾。

UPD:它也在本地停止工作。现在什么都不懂了

docker go static echo middleware
1个回答
0
投票

根据您提供的信息,问题似乎与Docker容器中的路径解析有关。让我们尝试使用中间件中 Root 配置的绝对路径来修复它。StaticConfig:

  1. 修改您的 main.go 以包含嵌入包并使用 embed.FS 来提供您的静态文件:
package main

import (
    _ "embed"
    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
    "net/http"
    "os"
    "path/filepath"
)

//go:embed examples/html
var html embed.FS

func main() {
    e := echo.New()

    absPath, _ := filepath.Abs("examples/html")
    e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
        Root:       absPath,
        Filesystem: http.FS(html),
        Browse:     true,
        IgnoreBase: true,
    }))

    // Other routes and middlewares

    e.Start(":8080")
}

  1. 修改您的 Dockerfile 以包含必要的文件:
# Build stage
FROM golang:1.17 as build_stage

WORKDIR /app

COPY go.mod .
COPY go.sum .
RUN go mod download

COPY . .

RUN go build -o app-server .

# Final stage
FROM debian:buster

WORKDIR /app

COPY templates/ templates/
COPY examples/html/ examples/html/
COPY --from=build_stage /app/app-server /app/app-server

EXPOSE 8080

ENTRYPOINT [ "/app/app-server"]

通过这些更改,您的应用程序应该能够在 Docker 容器内运行时正确地提供静态文件。

此解决方案使用嵌入包和 http.FS 来提供静态文件。它还确保绝对路径用于 middleware.StaticConfig 中的 Root 配置。

© www.soinside.com 2019 - 2024. All rights reserved.