如何安装Go in alpine linux

Yog*_*war 17 tar go docker dockerfile alpine-linux

我试图在一个Alpine Docker图像中安装Go.为此,我从下载的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
Run Code Online (Sandbox Code Playgroud)

Cha*_*ant 30

我只是使用多阶段构建复制了它,到目前为止似乎还可以

FROM XXX
 
COPY --from=golang:1.13-alpine /usr/local/go/ /usr/local/go/
 
ENV PATH="/usr/local/go/bin:${PATH}"
Run Code Online (Sandbox Code Playgroud)

  • +1 喜欢这个答案!我没有意识到可以像这样组合两个 Docker 镜像。以前,如果我想在一个容器中放置两个主程序,我想我必须从映像中获取一个,然后在 RUN 命令中安装另一个。杰出的! (13认同)

Yog*_*war 13

谢谢BMitch。

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

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
Run Code Online (Sandbox Code Playgroud)

  • 当您运行“apk add --no-cache --virtual .build-deps bash gcc musl-dev openssl go”时,您可以在此之后运行 go version。为什么你需要它们之间的那些线? (2认同)

BMi*_*tch 9

使用Alpine,您可以使用libmusl而不是glibc.Alpine的libmusl不是1对1替换.与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)
Run Code Online (Sandbox Code Playgroud)

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

另一种选择是在Alpine上安装glibc,但是一旦你开始做这样的事情,我就会问为什么要使用Alpine,以及Debian或CentOS是否适合你.高山有一个关于这个主题的维基并有已创建的glibc包高山第三方.


zak*_*ine 9

我发现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

Run Code Online (Sandbox Code Playgroud)


Bev*_*qua 6

以下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"]
Run Code Online (Sandbox Code Playgroud)

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


mch*_*wre 6

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

docker pull golang:1.12-alpine
docker pull golang:1.11-alpine
Run Code Online (Sandbox Code Playgroud)