docker buildx 构建支持多架构的镜像
通过使用 buildx 可以构建支持多架构的 Docker 镜像,这里就通过两个例子快速给大家演示一下。
1
一个 Python Flask 镜像
因为 Python 本身就是跨平台的,构建支持多架构的 Python Docker 镜像就非常简单。
比如这样的一个简单的 python flask 程序,https://github.com/xiaopeng163/flask-redis ( https://github.com/xiaopeng163/flask-redis ) 以及这样的一个 Dockerfile
FROM python:3.9-alpineRUN pip install flask redis && \addgroup -S flask && adduser -S flask -G flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK=app.pyEXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]
想要构建一个多架构的 docker image,只需要下面几步:
docker login dockerhub
先通过 docker login 登录 dockerhub
docker login创建 buildx 环境
docker buildx create --name mybuilder --usebuid and push
docker buildx build --push --platform linux/arm64/v8,linux/amd64 -t xiaopeng163/flask-redis:latest .验证
去 dockerhub 查看 image tag https://hub.docker.com/repository/docker/xiaopeng163/flask-redis/tags?page=1&ordering=last_updated ( https://hub.docker.com/repository/docker/xiaopeng163/flask-redis/tags?page=1&ordering=last_updated )
2
一个需要下载可执行文件的例子
有时候我们在 dockerfile 里需要下载一个可执行文件,这时候文件本身就需要分平台了,比如下面这个 Dockerfile
FROM alpineARG VERSION=2.20.0RUN wget https://github.com/osrg/gobgp/releases/download/v${VERSION}/gobgp_${VERSION}_linux_amd64.tar.gz && \tar zxf gobgp_${VERSION}_linux_amd64.tar.gz && \rm -rf gobgp_${VERSION}_linux_amd64.tar.gz && \mv gobgpd /usr/bin && \mv gobgp /usr/binCMD []
上面这个 dockerfile,虽然我们也可以直接通过 docker buildx 去构建多平台的 docker image,但是除了 amd64 以外,其它平台的 docker 镜像是不可能正常工作的,因为我们下载的是 amd64 的可执行文件。
我们可以做如下修改
FROM alpineARG VERSION=2.20.0 TARGETARCH=amd64RUN wget https://github.com/osrg/gobgp/releases/download/v${VERSION}/gobgp_${VERSION}_linux_${TARGETARCH}.tar.gz && \tar zxf gobgp_${VERSION}_linux_${TARGETARCH}.tar.gz && \rm -rf gobgp_${VERSION}_linux_${TARGETARCH}.tar.gz && \mv gobgpd /usr/bin && \mv gobgp /usr/binCMD []
TARGETARCH 这个参数很特殊,平时我们使用 docker image build 的时候,我们需要手动传递这个参数,但是在使用 docker buildx 的时候就不需要手动传递了,buildx 会自动帮我们根据 build 的环境去传递。具体请参考 https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope ( https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope )
然后我们再通过 buildx 就可以了。
3
结尾
谢谢。希望大家可以自己尝试一下。