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