[英]How to install Go in alpine linux
我正在尝试在 Alpine Docker 映像中安装 Go。 为此,我从这里下载了 tar 文件到我的 alpine docker 镜像中,使用以下命令解压它:
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
我只是使用多阶段构建复制它,到目前为止似乎没问题
FROM XXX
COPY --from=golang:1.13-alpine /usr/local/go/ /usr/local/go/
ENV PATH="/usr/local/go/bin:${PATH}"
以下 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
感谢 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
使用 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 是否更适合您。 Alpine 有一个关于此的 wiki 主题,并且有第三方为 alpine 创建了 glibc 包。
我发现让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
如果基本要求是在基于 alpine 的 docker 镜像中安装特定的 go 版本,那么请参考官方 golang dockerhub 帐户上可用的这些镜像。
docker pull golang:1.12-alpine
docker pull golang:1.11-alpine
以防万一有人遇到与我相同的问题。
按照@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。
有 Alpine 包,带有最新版本的 golang:
pkg --update 添加去
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.