首页 > 解决方案 > 如何使用多阶段构建来消除 /go/pkg 文件

问题描述

我有这个dockerfile:

FROM golang:1.13 as cm_base

ADD ./netrc /root/.netrc

ENV GO111MODULE='on'
ENV GOPROXY='direct'
ENV GOSUMDB='off'

RUN mkdir -p /tmp/cm-go-api
WORKDIR /tmp/cm-go-api

ENV github_token='<some-access-token>'
ADD "https://raw.githubusercontent.com/ChannelMeter/cm-go-api/master/go.mod?token=$github_token"  
RUN go mod download 

ENV PROJECT_DIR '/go/src/github.com/channelmeter/cm-go-api'
WORKDIR "$PROJECT_DIR"
RUN git init
RUN git remote add origin 'https://github.com/ChannelMeter/cm-go-api.git'
ARG commit_id
RUN git fetch --depth 1 origin "$commit_id"
RUN git checkout "$commit_id"

RUN go install -v

FROM alpine:3.11.5

COPY --from=cm_base /go/bin /go/bin

EXPOSE 1992 

ENTRYPOINT ["/go/bin/cm-go-api"]

以上打破了 - 二进制可执行文件似乎不起作用,但如果我删除多阶段部分,它会起作用。例如,我删除了这 3 行:

    # FROM alpine:3.11.5
    # COPY --from=cm_base /go/bin /go/bin

有谁知道为什么原始 go build 命令生成的二进制文件不适用于 alpine?

如果我使用原始基础图像,它将起作用:

    FROM golang:1.13
    COPY --from=cm_base /go/bin /go/bin

使用 Alpine 作为第二阶段时的错误是:

standard_init_linux.go:211: exec 用户进程导致“没有这样的文件或目录”

标签: linuxdockeralpinedocker-build

解决方案


推荐阅读