阿尔卑斯山上的预编译戈朗



我正在尝试编写一个使用 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 笔记本电脑上工作正常,所以我不确定这里有什么区别。我做了一个快速的谷歌,我找不到任何明确指出缺少的东西。

Alpine 是使用 MUSL C 库构建的。在此环境中,不能运行已为 glibc 编译的二进制文件。您需要找到一个专门为 Alpine 平台构建的go二进制文件(例如,通过运行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是为阿尔卑斯山(musl libc(定制的glibc。
此过程允许在 Alpine 容器上运行 glibc 程序。

请注意,它确实增加了 Alpine 基本映像的大小 - 从 5.6MB 增加到 16.5MB - 但在这些情况下,这似乎为所需的兼容性付出了很小的代价,尤其是在安装程序本身非常大的情况下。

相关内容

  • 没有找到相关文章

最新更新