docker 不能 运行 一个已经存在的 go 输出文件
docker can't run a go output file that already exist
我正在为我的 go 项目构建一个多阶段 Dockerfile。
FROM golang:latest as builder
COPY ./go.mod /app/go.mod
COPY ./go.sum /app/go.sum
#exporting go1.11 module support variable
ENV GO111MODULE=on
WORKDIR /app/
#create vendor directory
RUN go mod download
COPY . /app/
RUN go mod vendor
#building source code
RUN go build -mod=vendor -o main -v ./src/
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/main /app/main
WORKDIR /app/
ARG port="80"
ENV PORT=$port
EXPOSE $PORT
CMD ["./main"]
当我 运行 图片时,它抛出错误:
standard_init_linux.go:207: exec user process caused "no such file or directory"
我已验证 'main' 文件存在于 /app/main 中。
我还尝试通过添加
来授予可执行权限
chmod +x /app/main
但还是不行。
可能有什么问题?
golang镜像的"latest"版本是基于debian的,使用libc。 Alpine 使用 musl。如果您不使用 CGO_ENABLED=0
进行编译,网络库将 link 到 libc,并且没有这样的文件或目录错误指向缺少的库。您可以使用 ldd /app/main
检查这些共享库 link。我能想到的几个解决方案:
- 用
CGO_ENABLED=0
编译你的程序
- 将构建映像切换为
FROM golang:alpine
- 将您的第二阶段更改为
FROM debian
我正在为我的 go 项目构建一个多阶段 Dockerfile。
FROM golang:latest as builder
COPY ./go.mod /app/go.mod
COPY ./go.sum /app/go.sum
#exporting go1.11 module support variable
ENV GO111MODULE=on
WORKDIR /app/
#create vendor directory
RUN go mod download
COPY . /app/
RUN go mod vendor
#building source code
RUN go build -mod=vendor -o main -v ./src/
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/main /app/main
WORKDIR /app/
ARG port="80"
ENV PORT=$port
EXPOSE $PORT
CMD ["./main"]
当我 运行 图片时,它抛出错误:
standard_init_linux.go:207: exec user process caused "no such file or directory"
我已验证 'main' 文件存在于 /app/main 中。 我还尝试通过添加
来授予可执行权限chmod +x /app/main
但还是不行。 可能有什么问题?
golang镜像的"latest"版本是基于debian的,使用libc。 Alpine 使用 musl。如果您不使用 CGO_ENABLED=0
进行编译,网络库将 link 到 libc,并且没有这样的文件或目录错误指向缺少的库。您可以使用 ldd /app/main
检查这些共享库 link。我能想到的几个解决方案:
- 用
CGO_ENABLED=0
编译你的程序
- 将构建映像切换为
FROM golang:alpine
- 将您的第二阶段更改为
FROM debian