如何在Alpine Linux中安装Go

时间:2018-08-28 11:06:47

标签: docker go dockerfile tar alpine

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

7 个答案:

答案 0 :(得分:8)

对于Alpine,您拥有libmusl而不是glibc。高山的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's go镜像使用)是在Alpine上编译go二进制文件。您可以在Dockerfile中看到golang图像:https://github.com/docker-library/golang/blob/69f2d2a132565bf60afc91813801a3bdcc981526/1.10/alpine3.8/Dockerfile

另一种选择是在Alpine上安装glibc,但是一旦您开始做这样的事情,我会问为什么要完全使用Alpine,以及Debian或CentOS对您来说是更合适的基础映像。高山有wiki topic on this,有third parties that have created glibc packages for alpine

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

以下Dockerfile对我有用。更简单,更抽象。

FROM python:3.6 # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app COPY . /app # Install any needed packages specified in requirements.txt RUN pip install --trusted-host pypi.python.org -r requirements.txt # Define environment variable ENV NAME Netflow # Run netflow.py CMD ["python", "netflow.py"]

答案 4 :(得分:0)

如果基本要求是在基于高山的docker映像中安装特定的go版本,则请参阅golang dockerhub官方帐户上可用的images

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

答案 5 :(得分:0)

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

  

FROM golang:1.13-alpine AS go

     

从XXX

     

COPY --from = go / usr / local / go / / usr / local / go /

     

RUN export PATH =“ / usr / local / go / bin:$ PATH” && go版本

答案 6 :(得分:0)

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

pkg --update 添加去