linux - 如何使用多阶段构建来消除 /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 用户进程导致“没有这样的文件或目录”
解决方案
推荐阅读
- flutter - 从 DropdownItems 中选择值后,DropdownButton 值未更新。如何使用 selectedValue 更新默认值?
- python - 在 Python 中从原始电子邮件中解析多个“To:”
- serialization - 如何将 BSON 反序列化为通用对象?
- javascript - 如何在 React-Table.js 中隐藏值为 null 的列?
- c# - 无法在 C# 中签名/验证签名
- facebook - Facebook 图形 api 按名称使用 OR 条件进行查询
- html - 模块化闪亮:HTML 样式标签不适用于命名空间工具提示
- css - CSS Grid - 响应式 - 多个 3 列行到 2 列行
- c# - c# UWP在DataReader创建数组后将字节写入新文件时访问路径被拒绝
- forms - 如何使用以下代码在输入表单中自动选择当前日期