我正在尝试使用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
答案 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