Golang中遇到输入中的意外NUL字符如何构建Docker镜像

Golang中遇到输入中的意外NUL字符如何构建Docker镜像 我正在尝试在Docker内构建我的项目,以下是我的Dockerfile内容:

构建阶段

FROM golang as builder

ENV GO111MODULE=on

WORKDIR /app

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . . 
RUN go get -d -v ./graphTry 
RUN go install ./graphTry
RUN go build -o /go/bin/akew ./graphTry/server/server.go
# 最终阶段
FROM alpine:3.7 as final
WORKDIR /usr/bin
COPY --from=build /go/bin .
EXPOSE 8080
CMD ["./akew"]

程序的入口文件是"server",它位于

graphTry/server

当我尝试构建Docker时,返回了一个错误

reading ./graphTry/server/server.go: unexpected NUL in input

这是什么意思?另外我的项目不在GOPATH中,这有关系吗?


更多关于Golang中遇到输入中的意外NUL字符如何构建Docker镜像的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

哦,天哪,非常感谢

更多关于Golang中遇到输入中的意外NUL字符如何构建Docker镜像的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Akezhan_Esbolatov:

invalid from flag value build

你将第一个阶段命名为 builder,而不是 build

这通常意味着文件中的某个位置存在字节 0x00。我怀疑这与 Docker 相关,你能在主机上构建它吗?

是的,我解决了这个问题,但现在又遇到了另一个问题,它返回:

Step 13/15 : COPY --from=build /go/bin .
invalid from flag value build: pull access denied for build, repository does not exist or may require 'docker login'

而且我没有使用私有仓库

这个错误通常是由于Docker构建过程中读取源代码文件时遇到NUL字符(\x00)导致的。这可能是由于文件编码问题、文件损坏或构建环境中的特殊字符引起的。项目不在GOPATH中不是导致此问题的原因,因为您已经设置了GO111MODULE=on启用了Go模块。

以下是几种解决方案:

方案1:检查并清理源代码文件

首先检查您的server.go文件是否包含NUL字符:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "strings"
)

func checkForNUL(filename string) error {
    content, err := ioutil.ReadFile(filename)
    if err != nil {
        return err
    }
    
    for i, b := range content {
        if b == 0 {
            return fmt.Errorf("NUL character found at position %d", i)
        }
    }
    
    return nil
}

func main() {
    err := checkForNUL("./graphTry/server/server.go")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("No NUL characters found")
}

方案2:优化Dockerfile

修改您的Dockerfile,添加文件验证步骤:

# 构建阶段
FROM golang:1.19 as builder

ENV GO111MODULE=on

WORKDIR /app

# 先复制模块文件
COPY go.mod .
COPY go.sum .

RUN go mod download

# 复制前验证文件
COPY . .
RUN find . -name "*.go" -exec grep -l $'\x00' {} \; && exit 1 || true

# 构建应用
RUN go build -o /go/bin/akew ./graphTry/server/server.go

# 最终阶段
FROM alpine:3.17
WORKDIR /usr/bin
COPY --from=builder /go/bin/akew .
EXPOSE 8080
CMD ["./akew"]

方案3:使用多阶段构建并清理文件

FROM golang:1.19 as builder

ENV GO111MODULE=on
WORKDIR /app

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

COPY . .

# 清理可能的不可见字符
RUN sed -i 's/\x0//g' graphTry/server/server.go

RUN go build -o /app/akew ./graphTry/server/server.go

FROM alpine:3.17
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/akew .
EXPOSE 8080
CMD ["./akew"]

方案4:使用tr命令过滤NUL字符

FROM golang:1.19 as builder

ENV GO111MODULE=on
WORKDIR /app

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

# 复制并过滤NUL字符
COPY . .
RUN find . -name "*.go" -exec tr -d '\000' < {} > {}.tmp \; -exec mv {}.tmp {} \;

RUN go build -o /app/akew ./graphTry/server/server.go

FROM alpine:3.17
WORKDIR /root/
COPY --from=builder /app/akew .
EXPOSE 8080
CMD ["./akew"]

调试步骤

在本地运行以下命令检查文件:

# 检查文件中的NUL字符
grep -r $'\x00' graphTry/server/server.go

# 或者使用hexdump检查
hexdump -C graphTry/server/server.go | grep 00

如果发现NUL字符,可以使用以下命令清理:

# 移除文件中的NUL字符
tr -d '\000' < graphTry/server/server.go > server_clean.go
mv server_clean.go graphTry/server/server.go

推荐使用方案2的Dockerfile,它在构建过程中会主动检测NUL字符并失败,帮助您定位问题。

回到顶部