现在我有一个用 golang 编写的程序,我试图在一个最小的容器中运行。这个go程序启动的时候正好启动了另外一个java写的子程序,这个子程序也需要运行在容器中。我想知道如何构建我的 Dockerfile 以将其作为“distroless”图像来实现。现在我正在探索这样的解决方案:FROM <golang-distro> as go-builderFROM <java-distro> as java-builderFROM <minimal-base-image># copy over all files needed to set up golang runtime to run go-parent-serviceCOPY --from=go-builder /<golang-binaries> /# copy over all files needed to set up java runtime so go-parent-service can run its java sub processCOPY --from-java-builder /<jvm-binaries> /# executable for the golang serviceCOPY /go-parent-service /# run the golang service, which will also start up the java service as sub processCMD ["/go-parent-service"]这种方法是否有意义,或者是否有更好的方法来构建此图像?我知道启动 java 服务的 go 服务使事情变得有点棘手,并且可能不是最佳实践。然而,由于我不拥有这个可执行文件,我无法分离出这些服务并在不同的容器中运行它们。
1 回答

RISEBY
TA贡献1856条经验 获得超5个赞
由于涉及 java,因此您的最小基础映像必须具有(至少)JRE 才能运行 java 类。
Go 程序不需要在目标映像上安装/复制 golang,因为它可以在目标映像的 go-distro 上构建为可执行文件。
如果go 源和 java 源可用于编译
FROM golang:<flavor> as go-builder
# Build go program here, i.e. produce a binary
FROM jdk-image:<flavor> as java-builder
# Compile sources to java classes or jar here
FROM <jre image>:<flavor>
COPY --from go-builder <go executable> .
COPY --from java-builder <java jar and related deps> .
CMD/ENTRYPOINT ["<run go bainary>"]
风味:高山、纤细等。
ELSE二进制文件可用,即具有所需依赖项的 go binary 和 java jar;然后可以简单地将它们复制到最终的 Java-JRE 映像并运行。前提是二进制文件是在考虑目标操作系统的情况下创建的。
- 1 回答
- 0 关注
- 115 浏览
添加回答
举报
0/150
提交
取消