如何在 alpine 中安装 Go linux

How to install Go in alpine linux

我正在尝试在 Alpine Docker 映像中安装 Go。为此,我从我的 alpine docker 图像中的 here 下载了 tar 文件,使用以下命令取消 tar 它:

tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

将 PATH 导出为二进制文件:

export PATH=$PATH:/usr/local/go/bin

但是,当我说 go version 时,它会说 sh: go: not found。我对高山很陌生。有谁知道,我在这里缺少什么?

重现步骤-

$ docker run -it alpine sh
$ wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ go version

使用 Alpine,您使用的是 libmusl 而不是 glibc。 Alpine 的 libmusl 不是一对一的替代品。链接到 glibc 的代码将显示实际上来自动态链接器的未找到错误。您可以使用 ldd:

查看哪些库链接到二进制文件
/ # ldd /usr/local/go/bin/go
        /lib64/ld-linux-x86-64.so.2 (0x7f63ceed1000)
        libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f63ceed1000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f63ceed1000)

有两种选择。首选选项,也是 docker 在 Alpine 上的 go images 使用的选项,是在 Alpine 上编译 go 二进制文件。您可以在 golang 图像的 Dockerfile 中看到:https://github.com/docker-library/golang/blob/69f2d2a132565bf60afc91813801a3bdcc981526/1.10/alpine3.8/Dockerfile

另一种选择是在 Alpine 上安装 glibc,但是一旦您开始这样做,我就会质疑为什么要使用 Alpine,以及 Debian 或 CentOS 是否更适合您。高山有一个 wiki topic on this and there are third parties that have created glibc packages for alpine.

感谢 BMitch。

我编译了 go 源代码并在 alpine 图像容器中执行了以下步骤。

echo "installing go version 1.10.3..." 
apk add --no-cache --virtual .build-deps bash gcc musl-dev openssl go 
wget -O go.tgz https://dl.google.com/go/go1.10.3.src.tar.gz 
tar -C /usr/local -xzf go.tgz 
cd /usr/local/go/src/ 
./make.bash 
export PATH="/usr/local/go/bin:$PATH"
export GOPATH=/opt/go/ 
export PATH=$PATH:$GOPATH/bin 
apk del .build-deps 
go version

以下 Dockerfile 对我有用。更简单更抽象。

FROM alpine:latest

RUN apk add --no-cache git make musl-dev go

# Configure Go
ENV GOROOT /usr/lib/go
ENV GOPATH /go
ENV PATH /go/bin:$PATH

RUN mkdir -p ${GOPATH}/src ${GOPATH}/bin

# Install Glide
RUN go get -u github.com/Masterminds/glide/...

WORKDIR $GOPATH

CMD ["make"]

来源:https://raw.githubusercontent.com/mickep76/alpine-golang/master/Dockerfile

如果基本要求是在基于 alpine 的 docker 映像中安装特定的 go 版本,请参考这些 images 可在官方 golang dockerhub 帐户上获得。

docker pull golang:1.12-alpine
docker pull golang:1.11-alpine

我只是使用多阶段构建将其复制过来,到目前为止似乎没问题

FROM XXX
 
COPY --from=golang:1.13-alpine /usr/local/go/ /usr/local/go/
 
ENV PATH="/usr/local/go/bin:${PATH}"

我发现在 alpine linux 中获取 golang up 运行 的最佳方法是从源代码安装它。这也是官方 alpine go docker 图像中遵循的方式。

FROM alpine:3.12

ARG GOLANG_VERSION=1.14.3

#we need the go version installed from apk to bootstrap the custom version built from source
RUN apk update && apk add go gcc bash musl-dev openssl-dev ca-certificates && update-ca-certificates

RUN wget https://dl.google.com/go/go$GOLANG_VERSION.src.tar.gz && tar -C /usr/local -xzf go$GOLANG_VERSION.src.tar.gz

RUN cd /usr/local/go/src && ./make.bash

ENV PATH=$PATH:/usr/local/go/bin

RUN rm go$GOLANG_VERSION.src.tar.gz

#we delete the apk installed version to avoid conflict
RUN apk del go

RUN go version

有Alpine包,golang最新版本:

pkg --update 添加去

以防有人遇到与我相同的问题。

按照@Yogesh Jilhawar 的回答,我能够安装 golang1.17.6 ion Alpine3.15。

当我运行命令apk add --no-cache --virtual .build-deps bash gcc musl-dev openssl go时,我得到了

ERROR: unable to select packages:
  go (no such packages):
    required by: world[go]

然后我尝试安装“gcc-go”,它安装了。之后就可以成功从源码构建golang了