Background
https://github.com/wagoodman/dive
dive 是一個很方便查閱 docker container 內部狀態的工具. 有很好的視覺化介面, 觀察 image layers 與檔案的變化, layers 每一層的大小, 效率等等.
Docker Images layers
docker image 會由多個 layers 組成, 舉例來說要把編譯好的 JAR 再打包變成 docker image 方便部署時, 在建構 image 時大概會是這樣
但如果要看到更實際的操作, 比如說 apt-get install 到底對哪些檔案造成異動, 就能使用 dive 這個工具.
https://github.com/wagoodman/dive
Example
通常 java 專案的打包流程大概類似這樣
# 用 maven 打包 JAR, 會產生 ./target/xxx.jar
mvn clean package
然後使用 dockerfile 進一步將 jar 打包為 docker image, 因為是隨便寫的, 所以產生了 demo-1.0.0.jar.
# 要跑在 java 21 的環境
FROM eclipse-temurin:21-jre-alpine
# 將 host 的 demo-1.0.0.jar 複製到 container 裏面
COPY ./target/demo-1.0.0.jar /app.jar
# 設定啟動後要執行 java -jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# 在 dockerfile 的資料夾下打包為 demo:1.0.0 的 images
docker build -tdemo:1.0.0 .
再來就可以用 dive 觀看狀態.
7.8 MB 是 OS Layers
19 MB 看起來是安裝了一些 OS 基本 dependencies (沒深入了解.
165 MB 看起來也是安裝了一些 OS 基本 dependencies (沒深入了解.
最後的 20 MB 就是 demo-1.0.0.jar JAR 本體.