从 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 的新手):
- 安装 Go
- 安装 Go dependencies/libraries
- 安装合适的 C 编译器
- 将 Go/Cgo 个源文件复制到容器中
- 使用
CGO_ENABLED=1 go build -buildmode=c-shared
将Go/Cgo代码编译成共享二进制文件
- 复制python个源文件到容器
- 使用 CMD
分配 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" ]
我的主要应用程序是 python,我有一些 Go 代码想从 Docker 容器中的 python 调用。通常我使用 CGO 和 go build -buildmode=c-shared -o dllname.dll
编译 Go 代码,并使用其他语言的代码。在 python 中,我可以 运行 使用 ctypes
模块和 cdll.LoadLibrary
(在 windows 上)的 dll。
在我看来,这就是它在 Docker 文件中的工作方式(我是 Docker 的新手):
- 安装 Go
- 安装 Go dependencies/libraries
- 安装合适的 C 编译器
- 将 Go/Cgo 个源文件复制到容器中
- 使用
CGO_ENABLED=1 go build -buildmode=c-shared
将Go/Cgo代码编译成共享二进制文件
- 复制python个源文件到容器
- 使用 CMD 分配 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" ]