如何构建一个最小的“distroless”图像来运行运行 java 子服务的 golang 服务?

现在我有一个用 golang 编写的程序,我试图在一个最小的容器中运行。这个go程序启动的时候正好启动了另外一个java写的子程序,这个子程序也需要运行在容器中。我想知道如何构建我的 Dockerfile 以将其作为“distroless”图像来实现。


现在我正在探索这样的解决方案:


FROM <golang-distro> as go-builder

FROM <java-distro> as java-builder

FROM <minimal-base-image>


# copy over all files needed to set up golang runtime to run go-parent-service

COPY --from=go-builder /<golang-binaries> /


# copy over all files needed to set up java runtime so go-parent-service can run its java sub process

COPY --from-java-builder /<jvm-binaries> /


# executable for the golang service

COPY /go-parent-service /


# run the golang service, which will also start up the java service as sub process

CMD ["/go-parent-service"]

这种方法是否有意义,或者是否有更好的方法来构建此图像?我知道启动 java 服务的 go 服务使事情变得有点棘手,并且可能不是最佳实践。然而,由于我不拥有这个可执行文件,我无法分离出这些服务并在不同的容器中运行它们。


喵喔喔
浏览 116回答 1
1回答

RISEBY

由于涉及 java,因此您的最小基础映像必须具有(至少)JRE 才能运行 java 类。Go 程序不需要在目标映像上安装/复制 golang,因为它可以在目标映像的 go-distro 上构建为可执行文件。如果go 源和 java 源可用于编译FROM golang:<flavor> as go-builder&nbsp;# Build go program here, i.e. produce a binaryFROM jdk-image:<flavor> as java-builder# Compile sources to java classes or jar hereFROM <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 映像并运行。前提是二进制文件是在考虑目标操作系统的情况下创建的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go