是否有可能通过docker golang构建一个静态sqlite Go应用程序:alpine image?

时间:2018-01-08 04:12:46

标签: sqlite docker go

我正在尝试使用docker构建包含go-sqlite3的应用程序。

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

我使用此命令将已编译的程序复制到我的主机操作系统(Arch Linux)。

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

问题是编译的程序缺少动态库

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

我的期望是什么

$  ldd app
not a dynamic executable

2 个答案:

答案 0 :(得分:1)

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

将Dockerfile的go-wrapper install行更改为

RUN go-wrapper install -ldflags "-linkmode external -extldflags -static"   

答案 1 :(得分:0)

如果我正确理解您的问题,这取决于您如何构建Golang可执行文件。

您应该将CGO_ENABLED设置为0来构建您的包。为了做到这一点,在编译之前,只需在终端上运行export CGO_ENABLED=0而不是构建Golang二进制文件。

如果您有兴趣,可以找到有关CGO here

的更多信息