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
哦,天哪,非常感谢
更多关于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字符并失败,帮助您定位问题。

