如何在 alpine linux 中安装 Go

Posted

技术标签:

【中文标题】如何在 alpine linux 中安装 Go【英文标题】:How to install Go in alpine linux 【发布时间】:2019-02-02 23:59:42 【问题描述】:

我正在尝试在 Alpine Docker 映像中安装 Go。为此,我在我的 alpine docker 映像中从 here 下载了 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

【问题讨论】:

echo $PATH 告诉你什么? /usr/local/go/bin # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin 它已经在其中添加了 PATH.. 不是您直接问题的答案,但您可以使用official Golang alpine docker images 之一。你也可以使用官方的 Dockerfile 作为指南来设置你自己的。 你是对的..但我对我的项目有一些具体要求 【参考方案1】:

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

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

【讨论】:

+1 喜欢这个答案!我没有意识到可以像这样组合两个 Docker 图像。以前,如果我想要一个容器中的两个主程序,我认为我必须从映像中获取一个,然后在 RUN 命令中安装另一个。太棒了! 很好的答案。查看当前的golang Dockerfile,您可以看到最后几行与 go 路径有关。如果您需要 go 路径,请在 Dockerfile 中的 COPY 之后包含以下内容 ENV GOPATH /go ENV PATH $GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"【参考方案2】:

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

【讨论】:

是的,这应该是更好的答案。【参考方案3】:

感谢 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

【讨论】:

当你运行“apk add --no-cache --virtual .build-deps bash gcc musl-dev openssl go”之后,你可以运行go版本。为什么你需要它们之间的那些线? 你也可以这样做。但是,我更专注于安装特定版本的 go【参考方案4】:

使用 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 映像使用的首选选项是在 Alpine 上编译 go 二进制文件。你可以在 golang 镜像的 Dockerfile 中看到这一点:https://github.com/docker-library/golang/blob/69f2d2a132565bf60afc91813801a3bdcc981526/1.10/alpine3.8/Dockerfile

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

【讨论】:

【参考方案5】:

我发现让golang 在 alpine linux 中运行的最佳方法是从源代码安装它。这也是官方 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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

pkg --update add go

【讨论】:

pkg 在 Alpine 上默认不作为二进制文件存在

以上是关于如何在 alpine linux 中安装 Go的主要内容,如果未能解决你的问题,请参考以下文章

在 Alpine Linux 中安装 bash shell

如何在 Alpine Linux Docker Container 中安装“Microsoft Access Driver (*.mdb, *.accdb)”驱动程序

如何在alpine 3.12中安装qt4

如何在 alpine:3.8 中安装 Nodejs 8.12?

在 Alpine Linux Docker 容器中安装 ODBC 驱动程序

在 Alpine docker 中安装软件包