所以。我有这样的结构:
应用程序 -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容器中的路径解析有关。让我们尝试使用中间件中 Root 配置的绝对路径来修复它。StaticConfig:
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")
}
# 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 配置。