我正在尝试在 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
我刚刚使用多阶段构建复制了它,到目前为止似乎没问题
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
# 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
使用 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 包。
我发现在 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
如果基本要求是在基于 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了。
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"
有 Alpine 包,带有最新版本的 golang:
pkg --更新添加go