从 python 构建 Docker 调用 CGO 的容器

Building Docker container that calls CGO from python

我的主要应用程序是 python,我有一些 Go 代码想从 Docker 容器中的 python 调用。通常我使用 CGO 和 go build -buildmode=c-shared -o dllname.dll 编译 Go 代码,并使用其他语言的代码。在 python 中,我可以 运行 使用 ctypes 模块和 cdll.LoadLibrary(在 windows 上)的 dll。

在我看来,这就是它在 Docker 文件中的工作方式(我是 Docker 的新手):

  1. 安装 Go
  2. 安装 Go dependencies/libraries
  3. 安装合适的 C 编译器
  4. 将 Go/Cgo 个源文件复制到容器中
  5. 使用CGO_ENABLED=1 go build -buildmode=c-shared
  6. 将Go/Cgo代码编译成共享二进制文件
  7. 复制python个源文件到容器
  8. 使用 CMD
  9. 分配 python 入口点

为了制作这样的 Docker 文件,我做了很多徒劳的尝试。这可行吗?

按照 jakub 的建议使用 golang:1.17.2-bullseye 图像使其工作。这是 Dockerfile:

FROM golang:1.17.2-bullseye as builder
WORKDIR /go/src/app
COPY ./lib/cgo .
RUN go get ./...
RUN CGO_ENABLED=1 go build -buildmode=c-shared -o cgolibname.so .

FROM python:3.9
WORKDIR /app
COPY ./appname .
COPY --from=builder /go/src/app/cgolibname.so .
CMD [ "python", "main.py" ]