#python #docker #go #alpine
#python #docker #Вперед #alpine-linux
Вопрос:
Я работаю над использованием встроенной разделяемой библиотеки golang в скрипте python (ctypes loadlibrary) в контейнере на базе alpine.
Но это не удалось следующим образом,
/usr/src/app # **go build -o cc.so -buildmode=c-shared main.go**
/usr/src/app # **readelf -d cc.so**
Dynamic section at offset 0x10cd10 contains 22 entries: Tag Type
Name/Value 0x0000000000000001 (NEEDED) Shared library:
[libc.musl-x86_64.so.1] 0x0000000000000010 (SYMBOLIC) 0x0
0x000000000000000c (INIT) 0x42000 0x000000000000000d (FINI) 0x92ed9
0x0000000000000019 (INIT_ARRAY) 0xa2078 0x000000000000001b
(INIT_ARRAYSZ) 8 (bytes) 0x000000006ffffef5 (GNU_HASH) 0x270
0x0000000000000005 (STRTAB) 0xa50 0x0000000000000006 (SYMTAB) 0x378
0x000000000000000a (STRSZ) 1026 (bytes) 0x000000000000000b (SYMENT) 24
(bytes) 0x0000000000000003 (PLTGOT) 0x10deb0 0x0000000000000002
(PLTRELSZ) 720 (bytes) 0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x41a00 0x0000000000000007 (RELA) 0xe58
0x0000000000000008 (RELASZ) 265128 (bytes) 0x0000000000000009
(RELAENT) 24 (bytes) 0x000000000000001e (FLAGS) SYMBOLIC BIND_NOW
STATIC_TLS 0x000000006ffffffb (FLAGS_1) Flags: NOW NODELETE
0x000000006ffffff9 (RELACOUNT) 11040 0x0000000000000000 (NULL) 0x0
/usr/src/app # **python test.py**
Traceback (most recent call last): File
"test.py", line 2, in lib = ctypes.cdll.LoadLibrary('./cc.so') File
"/usr/lib/python2.7/ctypes/init.py", line 444, in LoadLibrary return
self._dlltype(name) File "/usr/lib/python2.7/ctypes/init.py", line
366, in init self._handle = _dlopen(self._name, mode) OSError: Error
relocating ./cc.so: : initial-exec TLS resolves to dynamic definition
in ./cc.so
Я пробовал следующие образы docker
-
Alpine 3.9 устанавливает на него go и python 2.7
-
go1.12: alpine и python2.7: alpine запускают go build для создания общей библиотеки (go build -o cc.so -buildmode=c-shared main.go), затем скопируйте cc.so для python2.7: альпийский контейнер, запустите python test.py
Та же проблема.
Но если я использую изображение ubuntu16.04 и устанавливаю go и python для выполнения того же теста, он работает.
Main.go и test.py заключаются в следующем,
//main.go
package main
import "C"
//export add
func add(left, right int) int {
return left right
}
//export minus
func minus(left, right int) int {
return left - right
}
//export multiply
func multiply(left, right int) int {
return left * right
}
//export divide
func divide(left, right int) int {
return left / right
}
//export testPrint
func testPrint(){
print("test")
}
func main() {
}
// test.py
import ctypes
lib = ctypes.cdll.LoadLibrary('./cc.so')
if lib is not None:
print ("can load so")
Комментарии:
1. вы нашли какое-либо решение? Я застрял в подобной проблеме.
2. та же проблема здесь с использованием docker image: python: 3.9-alpine и go1.16.10