fix(builder/go1.23): add require sless/fn/handler to server/go.mod at build time
go.work replace rule requires explicit require directive in server/go.mod. Patch appended at kaniko build time - no base image rebuild needed.
This commit is contained in:
+19
-11
@@ -70,9 +70,9 @@ func runtimeBaseImage(runtime string) (string, error) {
|
||||
case "nodejs20":
|
||||
return "naeel/sless-runtime-nodejs20:v0.1.2", nil
|
||||
case "go1.23":
|
||||
// Go использует builder-образ (содержит golang:1.23 + server.go + go.mod/go.sum с pgx/v5).
|
||||
// Конечный образ multi-stage — alpine без компилятора.
|
||||
return "naeel/sless-runtime-go1.23:v0.1.2", nil
|
||||
// Go использует builder-образ (содержит golang:1.23 + server/ + go.mod/go.sum с pgx/v5).
|
||||
// v0.1.3: server/ субдиректория + go.work позволяет пользовательский go.mod с любыми зависимостями.
|
||||
return "naeel/sless-runtime-go1.23:v0.1.3", nil
|
||||
default:
|
||||
return "", fmt.Errorf("unsupported runtime: %q (supported: python3.11, nodejs20, go1.23)", runtime)
|
||||
}
|
||||
@@ -90,18 +90,26 @@ func generateDockerfile(runtime string, hasRequirements bool, hasPackageJSON boo
|
||||
|
||||
switch runtime {
|
||||
case "go1.23":
|
||||
// Go: multi-stage build.
|
||||
// base-образ содержит: server.go (package main) + go.mod (module sless/fn).
|
||||
// kaniko копирует пользовательский код в handler/ (package handler).
|
||||
// go build видит: /app/server.go + /app/handler/*.go под одним модулем sless/fn.
|
||||
// Если у пользователя есть go.mod — он кладётся в /app/handler/go.mod (игнорируется).
|
||||
// COPY . /app/handler/ — пользовательские файлы лежат в корне tar-контекста (без prefix).
|
||||
// kaniko не умеет переименовывать пути при COPY, поэтому копируем всё "." в handler/.
|
||||
// Go: multi-stage build с go.work (v0.1.3+).
|
||||
// base-образ содержит: /app/server/ (module sless/fn/server, package main).
|
||||
// kaniko копирует пользовательский код в /app/handler/.
|
||||
// Генерируем go.mod для handler если его нет (module sless/fn/handler).
|
||||
// Генерируем go.work: use ./server + use ./handler + replace sless/fn/handler => ./handler.
|
||||
// replace позволяет server.go импортировать sless/fn/handler независимо от имени модуля пользователя.
|
||||
// GOFLAGS=-mod=mod: позволяет go build подтягивать зависимости из handler/go.mod через GOPROXY.
|
||||
goModStep := ""
|
||||
if !hasGoMod {
|
||||
// Пользователь не предоставил go.mod — генерируем минимальный
|
||||
goModStep = "RUN printf 'module sless/fn/handler\\n\\ngo 1.23\\n' > /app/handler/go.mod\n"
|
||||
}
|
||||
content := fmt.Sprintf(
|
||||
"FROM %s AS builder\n"+
|
||||
"WORKDIR /app\n"+
|
||||
"COPY . /app/handler/\n"+
|
||||
"RUN CGO_ENABLED=0 go build -o /server .\n"+
|
||||
goModStep+
|
||||
"RUN printf 'go 1.23\\n\\nuse ./server\\nuse ./handler\\n\\nreplace sless/fn/handler => ./handler\\n' > /app/go.work\n"+ // server/go.mod не содержит require sless/fn/handler — Go требует явного require даже при replace в go.work.
|
||||
// Патчим server/go.mod в момент kaniko-сборки (не меняет базовый образ).
|
||||
"RUN printf '\\nrequire sless/fn/handler v0.0.0\\n' >> /app/server/go.mod\n"+"RUN CGO_ENABLED=0 go build -o /server ./server\n"+
|
||||
"FROM alpine:3.20\n"+
|
||||
"COPY --from=builder /server /server\n"+
|
||||
"EXPOSE 8080\n"+
|
||||
|
||||
Reference in New Issue
Block a user