我打包了一个 hbase 的 docker 镜像,支持 arm 和 x86 ,市面上的基本都是支持 x86
我现在想上传到 docker hub 中,遇到了一个问题
我在 x86 的 机器上 docker build 之后,docker push 上传,docker hub 显示有 x86 的镜像了
─➤ docker push ponponon/hbase:2.4.17
The push refers to repository [docker.io/ponponon/hbase]
5cbe117ca7a7: Pushed
5303d123946a: Pushed
b21157a8f1f4: Pushed
d82aed3adae2: Pushed
5f70bf18a086: Mounted from library/kibana
1fb8d5fc2705: Pushed
b071800f76fa: Pushed
e144ebbfe119: Pushed
c294749127ef: Pushed
14d6affed4ad: Pushed
9f54eef41275: Mounted from library/ubuntu
2.4.17: digest: sha256:0c66a2af5ea9ea0c2413657e4fb2cd9115039024a0ffe80508a58890af618579 size: 2630
然后我在 arm 机器上docker build 之后,docker push 上传,docker hub 显示有 arm 的镜像了,但是只有 arm 镜像了,x86 的被顶掉了?
╰─➤ docker push ponponon/hbase:2.4.17
The push refers to repository [docker.io/ponponon/hbase]
edfb34a786a7: Pushed
272c03189843: Pushed
0d05a4ccd76c: Pushed
d8c93dd63834: Pushed
5f70bf18a086: Pushed
bdc124c7e85d: Pushed
e8a59430d56c: Pushed
6488763422f5: Pushed
011514ed52e7: Pushed
ac0b27eeb113: Pushed
5e2386038042: Mounted from library/ubuntu
2.4.17: digest: sha256:4644d9d652abac970b4142c890fec61fd94006d53233754e1c3566ca71ff078d size: 2630
https://hub.docker.com/r/ponponon/hbase/tags
我本来以为,上传同名同标签的镜像,只要 arch 不一样,是不会被顶替的,但是实际上貌似不是?
我要怎么才能既上传 x86 镜像,又上传 arm 镜像?
就像 python 在 docker hub 上的镜像一样,支持多 arch?
我需要在打包镜像 ponponon/hbase:2.4.17 ,这个镜像支持 x86 和 arm,但是 x86 和 arm 需要的 Dockerfile 不一样,怎么使用 dockerfile 构建跨平台镜像?
x86 的 Dockerfile
FROM ubuntu:focal
RUN . /etc/os-release && cat > /etc/apt/sources.list <<EOF
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
EOF
RUN apt-get update
RUN apt-get install -y vim
RUN apt-get install -y openjdk-8-jdk
RUN apt-get install -y wget
WORKDIR /root
RUN wget -P /root https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.4.17/hbase-2.4.17-bin.tar.gz
RUN tar xvf /root/hbase-2.4.17-bin.tar.gz
RUN echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" | tee -a /etc/profile >/dev/null
COPY entrypoint.sh /root/
arm 的 Dockerfile
FROM ubuntu:focal
RUN . /etc/os-release && cat > /etc/apt/sources.list <<EOF
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
EOF
RUN apt-get update
RUN apt-get install -y vim
RUN apt-get install -y openjdk-8-jdk
RUN apt-get install -y wget
WORKDIR /root
RUN wget -P /root https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.4.17/hbase-2.4.17-bin.tar.gz
RUN tar xvf /root/hbase-2.4.17-bin.tar.gz
RUN echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64" | tee -a /etc/profile >/dev/null
COPY entrypoint.sh /root/
上面两个 Dockerfile 有两个区别:
- 首先
/etc/apt/sources.list
的内容不一样,amr 的是带 -ports 后缀的 - 然后,JAVA_HOME 这个环境变量不一样,x86 的是
/usr/lib/jvm/java-8-openjdk-amd64
,arm 的是/usr/lib/jvm/java-8-openjdk-arm64
它那个是不是 multi platform image 。
这个不是分别 build ,然后在分别推上去;而是直接一次 build 出来推上去的。