在 alpine 上预编译 golang

precompiled golang on alpine

我正在尝试编写一个使用 alpine 并利用预编译 golang 的 dockerfile。

docker run -it  alpine:latest
wget https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz --no-check-certificate
tar -C /usr/local/ -xzf go1*.tar.gz

我得到 /bin/sh/: ./go: 未找到

cd /usr/local/go/bin/
./go

它在我的 ubuntu 笔记本电脑上运行良好,所以我不确定这里有什么区别。我做了一个快速 google,但我找不到任何明确指出缺少的东西。

Alpine 是使用 MUSL C 库构建的。您不能 运行 在此环境中为 glibc 编译的二进制文件。您需要找到一个明确为 Alpine 平台构建的 go 二进制文件(例如 运行ning apk add go)。

您需要为 Dockerfile 使用 golang:alpine 基本图像(查看可用标签:https://hub.docker.com/_/golang):

FROM golang:alpine

RUN go version

或:

docker run -it golang:alpine /bin/sh

正如 larsks 所回答的那样,Alpine 通常不会 运行 glibc 构建二进制文件,至少不会开箱即用。

但是,在某些情况下,所需的二进制文件不可用,例如,Alpine 不提供确切需要的 go 构建。或者,在 Java (AdoptOpenJDK) 的情况下,您需要经过认证的二进制文件,这些二进制文件仅适用于 glibc 构建。

在这些情况下,您可以创建启用 glibc 的 Alpine 容器:

# Based on: https://github.com/anapsix/docker-alpine-java
FROM alpine:latest

ENV GLIBC_REPO=https://github.com/sgerrand/alpine-pkg-glibc
ENV GLIBC_VERSION=2.28-r0

RUN set -ex && \
    apk --update add libstdc++ curl ca-certificates && \
    for pkg in glibc-${GLIBC_VERSION} glibc-bin-${GLIBC_VERSION}; \
        do curl -sSL ${GLIBC_REPO}/releases/download/${GLIBC_VERSION}/${pkg}.apk -o /tmp/${pkg}.apk; done && \
    apk add --allow-untrusted /tmp/*.apk && \
    rm -v /tmp/*.apk && \
    /usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib

alpine-pkg-glibc 是为 Alpine (musl libc) 定制的 glibc。
此过程在您的 Alpine 容器上启用 运行ning glibc 程序。

请注意,它确实增加了 Alpine 基础映像的大小 - 从 5.6MB 到 16.5MB - 但在这些情况下,为了获得所需的兼容性,这似乎是一个很小的代价,特别是如果安装的程序本身非常大。