2

I'm trying to build my app which contains go-sqlite3 by docker.

main.go

package main

import (
        "database/sql"

        _ "github.com/mattn/go-sqlite3"
)

func main() {
        sql.Open("sqlite3", "test.db")
}

Dockerfile

FROM golang:alpine
RUN apk add --no-cache git
RUN apk add --no-cache sqlite-libs sqlite-dev
RUN apk add --no-cache build-base
WORKDIR /go/src/app
COPY *.go ./
RUN go-wrapper download
RUN go-wrapper install

I use this command to copy the compiled program out to my host OS (Arch Linux).

docker build -t mygo .
docker run --rm -v $$PWD:/usr/src/app mygo /bin/cp /go/bin/app /usr/src/app

The problem is the compiled program is missing dynamic library

$  ldd app
   ...
   libc.musl-x86_64.so.1 => not found

What I expected is like

$  ldd app
not a dynamic executable
Daniel YC Lin
  • 15,050
  • 18
  • 63
  • 96

2 Answers2

2

refer to how to create a statically linked golang executable with go 1.5+

Change the Dockerfile's go-wrapper install line into

RUN go-wrapper install -ldflags "-linkmode external -extldflags -static"   
Daniel YC Lin
  • 15,050
  • 18
  • 63
  • 96
0

If I correctly understood your problem it depends on how you build the Golang executable.

You should build your package with CGO_ENABLED set to 0. In order to do that, before compiling, simply run export CGO_ENABLED=0 on your terminal than build your Golang binary.

If you are interested you can find more info about CGO here

fredmaggiowski
  • 2,232
  • 3
  • 25
  • 44
Bestbug
  • 475
  • 4
  • 13