在Docker容器中运行go二进制文件时找不到Spatialite扩展

时间:2018-08-14 08:35:19

标签: sqlite docker go dynamic-library spatialite

我正在建立一个Spatialite数据库(SQLite + Spatialite扩展名)和一个关联的Go程序,该程序在docker容器中运行,以查询数据库并返回数据。

我认为Go-spatialite将在运行时动态加载spacespaceite库以查询数据库。在本地运行Go程序并使用Postman查询服务时,一切运行正常。

但是,当使用容器时,Go程序无法找到spacespaceite扩展名:

"error":"shaxbee/go-spatialite: spatialite extension not found."

我使用go-spatialite (shaxbee) packagedatabase/sql软件包。我已经在本地安装了Spatialite。

我这样打开数据库连接:

db, err := sql.Open("spatialite", "path/to/my/db")
if err != nil {
    logVar.WithError(err).Fatal("Impossible to open database")
}
if err := db.Ping(); err != nil {
    logVar.WithError(err).Fatal("Cannot connect to database")
}

我使用此Dockerfile来修改我的(基于alpine-glibc),以便在图像构建期间安装Spatialite库。根据{{​​3}}的说法,它会为spacespaceite库寻找不同的内容并将其加载。

在容器中检查/usr/local/lib/时,库位于:

libspatialite.a
libspatialite.la
libspatialite.so
libspatialite.so.7
libspatialite.so.7.1.0
libsqlite3.so
libsqlite3.so.0
libsqlite3.so.0.8.6

在我看来,该程序不知道从何处获取库。你有什么想法 ?

谢谢

1 个答案:

答案 0 :(得分:0)

Dockerfile设置了一个libspatialite版本4.3.0a的容器。

...

RUN wget "http://www.gaia-gis.it/gaia-sins/freexl-1.0.4.tar.gz" && tar zxvf freexl-1.0.4.tar.gz && cd freexl-1.0.4 && ./configure && make && make install

RUN wget "http://www.gaia-gis.it/gaia-sins/libspatialite-4.3.0a.tar.gz" && tar zxvf libspatialite-4.3.0a.tar.gz && cd libspatialite-4.3.0a && ./configure && make && make install

RUN wget "http://www.gaia-gis.it/gaia-sins/readosm-1.1.0.tar.gz" && tar zxvf readosm-1.1.0.tar.gz && cd readosm-1.1.0 && ./configure && make && make install

RUN wget "http://www.gaia-gis.it/gaia-sins/spatialite-tools-4.3.0.tar.gz" && tar zxvf spatialite-tools-4.3.0.tar.gz && cd spatialite-tools-4.3.0 && ./configure && make && make install
...

从最近对go-spatialite的提交之一中,我们可以看到所需的版本为5

var LibNames = []entrypoint{
    {"mod_spatialite", "sqlite3_modspatialite_init"},
    {"libspatialite.so", "sqlite3_modspatialite_init"},
    {"libspatialite.so.5", "spatialite_init_ex"},
    {"libspatialite.so", "spatialite_init_ex"},
}

spatialite.go

使用libspatialite第5版的容器来解决您的问题。