我正在尝试编写一个使用 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 - 但在这些情况下,这似乎为所需的兼容性付出了很小的代价,尤其是在安装程序本身非常大的情况下。