skip to Main Content

I’m trying to use the lilliput library for Go. It is only made to run on Linux and OS X.

On my Linux (Debian 10.3) host machine as well as my WSL2 setup (Ubuntu 20.04.1), I have no problems running and building my code (excerpt below).

// main.go
package main

import (
    "github.com/discordapp/lilliput"
)

func main() {
    ...
    decoder, err := lilliput.NewDecoder(data)
    ...
}

However, when I try to put it in a Docker container, with the following configuration, it fails to build.

# Dockerfile v1
FROM golang:1.14.4-alpine AS build
RUN apk add build-base
WORKDIR /src
ENV CGO_ENABLED=1
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o /out/api .

ENTRYPOINT ["/out/api"]

EXPOSE 8080

I already tried adjusting the Dockerfile with different approaches, for example:

FROM alpine:edge AS build
RUN apk update
RUN apk upgrade
RUN apk add --update go=1.15.3-r0 gcc=10.2.0-r5 g++=10.2.0-r5
WORKDIR /app
RUN go env
ENV GOPATH /app
ADD . /app/src
WORKDIR /app/src
RUN go get -d -v
RUN CGO_ENABLED=1 GOOS=linux go build -o /app/bin/server

FROM alpine:edge
WORKDIR /app
RUN cd /app
COPY --from=build /app/bin/server /app/bin/server
CMD ["bin/server"]

Both result in the following build log:

https://pastebin.com/zMEbEac3

For completeness, the go env of the host machine.

GOARCH="amd64"
GOBIN=""
GOCACHE="/home/kingofdog/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/kingofdog/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/lib/go-1.11"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.11/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/kingofdog/{PROJECT FOLDER}/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build589460337=/tmp/go-build -gno-record-gcc-switches"

I already searched online for this error, but all I could find dealt with errors in the way others imported C libraries in their Go project. Yet, in my case I’m quite sure that it is not a mistake regarding the source code but rather a configuration mistake of the docker container, as the code itself works perfectly fine outside Docker and I couldn’t find a similar issue on the lilliput repository.

2

Answers


  1. Did you build the dependencies?

    You have to run the script to build the dependencies on Linux.
    Script: https://github.com/discord/lilliput/blob/master/deps/build-deps-linux.sh

    Their documentation mentions:

    Building Dependencies

    Go does not provide any mechanism for arbitrary building of dependencies, e.g. invoking make or cmake. In order to make lilliput usable as a standard Go package, prebuilt static libraries have been provided for all of lilliput’s dependencies on Linux and OSX. In order to automate this process, lilliput ships with build scripts alongside compressed archives of the sources of its dependencies. These build scripts are provided for OSX and Linux.

    In case it still fails, then issue might be linked to glibc-musl because alpine images have musl libc instead of glibc (GNU’s libc). So, you can try it with maybe Ubuntu/ CentOS/etc. minimal images or find a way to get glibc on alpine.

    Login or Signup to reply.
  2. The alpine docker image is a minimalistic Linux version – using musl-libc instead of glibc – and is typically used for building tiny images.

    To get the more featureful glibc – and resolve your missing CGO dependencies – use the non-alpine version of the golang Docker image to build your asset:

    #FROM golang:1.14.4-alpine AS build
    #RUN apk add build-base
    
    FROM golang:1.14.4 AS build
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search