簡體   English   中英

如何構建一個最小的“無發行版”鏡像來運行一個運行 java 子服務的 golang 服務?

[英]How to construct a minimal "distroless" image to run a golang service, which runs a java subservice?

現在我有一個用 golang 編寫的程序,我試圖在一個最小的容器中運行。 這個 go 程序啟動時,恰好啟動了另一個用 java 編寫的子程序,該子程序也需要在容器中運行。 我想知道如何構建我的 Dockerfile 以將其作為“無發行版”圖像來完成。

現在我正在探索這樣的解決方案:

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"]

這種方法有意義嗎,還是有更好的方法來構建這個圖像? 我知道 go 服務啟動 java 服務會使事情變得有點棘手,並且可能不是最佳實踐。 然而,由於我不擁有這個可執行文件,我無法分離出這些服務並在不同的容器中運行它們。

由於涉及 java,因此您的最小基礎映像必須具有(至少)JRE 才能運行 java 類。

Go 程序不需要在目標圖像上安裝/復制 golang,因為它可以構建為在目標圖像的 go-distro 上執行。

IF 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 二進制文件和 java jar 以及所需的依賴項; 然后可以簡單地將它們復制到最終的 Java-JRE 映像並運行。 如果在創建二進制文件時考慮了目標操作系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM