1、報錯
使用Dockerfile自己做的服務鏡像,docker run時啟動失敗,報錯如下:
standard init linux.go:228 exec user process caused: exec format error
2、原因一
當前服務器的CPU架構和構建鏡像時的CPU架構不兼容。比如做鏡像是在arm機器下構建的,而docker run是在amd架構下執行的。排查:
# 鏡像信息
docker inspect 鏡像ID |grep -i Arch
查看當前服務器的CPU架構信息:
# Linux信息
uname -a
# 或
lscpu
此時,可通過docker buildx插件模擬多CPU架構,構建出你需要的鏡像,從而解決這個問題。
2、原因二
要是前面的這個問題,那倒是明晰,坑就在你明明用docker buildx構建的,查看兩個架構信息也沒毛病,但還是報這個錯。
此時,考慮你Dockfile里的基礎鏡像,它的架構也要對應上。不能做amd下的鏡像,但基礎鏡像卻是arm下的。比如我之前使用JDK的鏡像,Dockerfile共用一個,開頭都是:
FROM openjdk:11.0.4
這個坑得處理掉,可以通過–platform參數來完成指定架構鏡像的拉取:
docker pull --platform linux/arm64 openjdk:11.0.4
docker pull --platform linux/amd64 openjdk:11.0.4
后面我是通過CICD平臺的,對應的打包腳本也就變成了:
問題解決!