Yogesh Jilhawar
Yogesh Jilhawar

Reputation: 6323

How to install Go in alpine linux

I am trying to install Go inside an Alpine Docker image. For that I downloaded tar file from here inside my alpine docker image, untar it using following command:

tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

exported PATH to have go binary as:

export PATH=$PATH:/usr/local/go/bin

However, when I say go version then it says that sh: go: not found. I am quite new to alpine. Does anyone know, what I am missing here?

Steps to reproduce-

$ 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

Upvotes: 60

Views: 135829

Answers (9)

Yogesh Jilhawar
Yogesh Jilhawar

Reputation: 6323

Thanks BMitch.

I compiled the go source code and performed the below steps inside alpine image container.

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

Upvotes: 29

James Bond
James Bond

Reputation: 3006

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"

Upvotes: 5

MartinZ
MartinZ

Reputation: 325

Just in case someone encounters the same issue with me.

I was able to install the golang1.17.6 ion Alpine3.15 by following @Yogesh Jilhawar 's answer.

When I ran the command apk add --no-cache --virtual .build-deps bash gcc musl-dev openssl go, I got

ERROR: unable to select packages:
  go (no such packages):
    required by: world[go]

Then I tried to install the "gcc-go", it installs. After that, I can build the golang from the source successfully.

Upvotes: 1

Michele Carino
Michele Carino

Reputation: 1048

There Is the Alpine package, with the latest versione of golang:

pkg --update add go

Upvotes: -5

Chad Grant
Chad Grant

Reputation: 45402

I just copied it over using multi stage builds, seems to be ok so far

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

Upvotes: 103

zakaria amine
zakaria amine

Reputation: 3682

I found the best way to get golang up running in alpine linux is to install it from source. This is also way followed in the official alpine go docker images.

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

Upvotes: 14

Bevilaqua
Bevilaqua

Reputation: 760

The following Dockerfile worked for me. Simpler and more abstract.

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"]

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

Upvotes: 45

mchawre
mchawre

Reputation: 12268

If the basic requirement is to have specific go version installed inside alpine based docker image then refer these images available on official golang dockerhub account.

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

Upvotes: 7

BMitch
BMitch

Reputation: 264376

With Alpine, you have libmusl instead of glibc. Alpine's libmusl is not a 1 for 1 replacement. Code linked against glibc will show a not found error which is actually from the dynamic linker. You can see what libraries are linked to the binary with 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)

There are two options. The preferred option, and one used by docker's go images on Alpine, is to compile the go binaries on Alpine. You can see this in the Dockerfile for the golang image: https://github.com/docker-library/golang/blob/69f2d2a132565bf60afc91813801a3bdcc981526/1.10/alpine3.8/Dockerfile

The other option is to install glibc on Alpine, but once you start doing things like that, I'd question why use Alpine at all, and whether Debian or CentOS would be a more appropriate base image for you. Alpine has a wiki topic on this and there are third parties that have created glibc packages for alpine.

Upvotes: 17

Related Questions