docker hub push multiple OS image with same tag
參考文章
https://github.com/docker/buildx/issues/1986
https://stackoverflow.com/questions/73812700/docker-error-internal-load-metadata-for-docker-io
大致上的步驟如下
- 準備好要build的Dockerfile
- 事先登入docker hub
- 透過內建的docker buildx來處理
- 建立一個builder
- 使用docker buildx 一次build多個平台image 並且推到docker hub上
注意事項
- 首先,確認一下docker hub desktop中的 設定 > docker engine ,feature.buildkit設定為false,如果build中有出現錯誤請查閱這個設定
- 注意建立builder的driver,下面會提到
準備Dockerfile
1 2 3 4 5 6 7 8 9 10 11 |
FROM node:22.0 COPY ./ /var/project RUN apt-get update && apt-get install -y vim nano chromium RUN apt-get install -y fonts-arphic-ukai fonts-arphic-uming fonts-ipafont-mincho fonts-ipafont-gothic fonts-unfonts-core RUN npm i -g npm RUN npm i -g pm2 EXPOSE 5000 ENV HOST=0.0.0.0 WORKDIR /var/project CMD ["node", "./server.js"] |
登入docker hub
可以透過指令
1 |
docker login |
也可以透過docker desktop介面先登入
建立Builder
1 |
docker buildx create --name container --driver-opt 'image=moby/buildkit:v0.12.1-rootless' --driver=docker-container |
其中,如果沒有加入–driver-opt參數,不指定用rootless的image很奇怪的Dockerfile中的apt-get指令會出現錯誤
Build指令
1 |
docker buildx build --tag MY_IMAGE_NAME:IMAGE_TAG --platform linux/arm64,linux/amd64 --builder container --push --no-cache . |
其中,–platform 可以依照你要的平台來指定,當然必須要是來源的image就已經支援的平台,這邊舉例build arm64與amd64兩個版本
–builder 指定我們剛剛建立的builder name
最後,我們就會在docker hub上面看到兩個不同OS的image了