如何在 alpine linux 中安装 Go

问题描述 投票:0回答:9

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

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

将 PATH 导出为二进制文件:

导出 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
docker go dockerfile tar alpine-linux
9个回答
85
投票

我刚刚使用多阶段构建复制了它,到目前为止似乎没问题

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

44
投票

以下 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


28
投票

谢谢 BMitch。

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

echo "installing go version 1.10.3..." 
apk add --no-cache --virtual .build-deps bash gcc musl-dev openssl go 

# download go tar 
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/ 

# compile code
./make.bash 
export PATH="/usr/local/go/bin:$PATH"
export GOPATH=/opt/go/ 
export PATH=$PATH:$GOPATH/bin 
apk del .build-deps 
go version

16
投票

使用 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)

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

另一个选择是在 Alpine 上安装 glibc,但是一旦你开始做类似的事情,我会质疑为什么要使用 Alpine,以及 Debian 还是 CentOS 是否是更适合你的基础镜像。 Alpine 有一个关于此的 wiki 主题,并且有 第三方为 alpine 创建了 glibc 包


13
投票

我发现在 alpine linux 中运行

golang
的最佳方法是从源代码安装它。官方的 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


7
投票

如果基本要求是在基于 alpine 的 docker 镜像中安装特定的 go 版本,请参考官方 golang dockerhub 帐户上提供的这些镜像

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

1
投票

以防万一有人遇到和我同样的问题。

我能够按照@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了。


1
投票

Dockerfile

ARG GOLANG_VERSION=1.20.4
RUN wget https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \
    rm -rf /usr/local/go && tar -C /usr/local -xzf go${GOLANG_VERSION}.linux-amd64.tar.gz && \
    rm go${GOLANG_VERSION}.linux-amd64.tar.gz
ENV PATH="${PATH}:/usr/local/go/bin"

-3
投票

有 Alpine 包,带有最新版本的 golang:

pkg --更新添加go

© www.soinside.com 2019 - 2024. All rights reserved.