一、基于环境ubuntu 20.2

要求系统内核版本>4.8 否则qemu环境安装有问题,需要升级内核版本。
安装docker
Docker version 20.10.7, build f0df350
开启实验特性
vi /etc/docker/dameon.json添加配置

"experimental": true

image.png
重启docker

service docker restart

查看是否启用

docker version -f '{{.Server.Experimental}}'

二、安装buildx,创建builder

mkdir -p $HOME/.docker/cli-plugins
wget -O $HOME/.docker/cli-plugins/docker-buildx \
 https://github.com/docker/buildx/releases/download/v0.7.1/buildx-v0.7.1.linux-amd64
chmod +x $HOME/.docker/cli-plugins/docker-buildx

创建builder,并创建arm构建环境 (arm环境下可省略qemu)

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx rm builder
docker buildx create --name builder --platform linux/arm64,linux/arm,linux/arm/v6,linux/arm/v8,linux/amd64,linux/386 --driver docker-container --use
docker buildx inspect builder --bootstrap

查看buildx和创建的builder

docker buildx version
docker buildx ls | grep builder

三、基础镜像制作

因为来源镜像的tag不相同,所以from时无法使用相同tag拉取对应cpu架构的镜像,所以使用manifest来将两个tag的镜像合并起来。用来制作跨cpu架构的基础镜像。

镜像来源:
x86 onlyoffice/documentserver:7.1.0.215
arm onlyoffice/documentserver:latest-arm
-> tag
docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-arm64
docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-amd64
-> manifest
docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215

#变更tag

docker tag onlyoffice/documentserver:latest-arm64 \
docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-arm64

docker push docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-arm64

docker tag onlyoffice/documentserver:7.1.0.215 \
docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-amd64

docker push docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-amd64

#创建manifest

docker manifest create docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215 \
docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-arm64 \
docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215-amd64

#推到私有仓库

docker manifest push docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215

docker manifest inspect docker.iflydocs.com/onlyoffice/documentserver:7.1.0.215

Dockerfile中的引用

FROM docker.iflydocs.com/onlyoffice/documentserver:${product_version}.${build_number}

如果添加--platform则指定使用某个cpu架构的镜像,如果不添加则使用build脚本中指定的环境。

四、构建

登录仓库

docker login docker.iflydocs.com -u admin -p xx

通过buildx指定Dockerfile构建
docker buildx build --platform linux/amd64,linux/arm64 --push -t docker.iflydocs.com/docsoffice:$tag --progress=plain .

参数说明:
--platform 可选构建平台
-t:镜像名 版本号
--progress=plain 打印详细日志
-f 可选Dockerfile路径

五、使用

运行

docker run -p 80:80 -d docker.iflydocs.com/docsoffice:$tag

$tag为构建日期,如:20221209

拉取镜像(默认当前电脑cpu架构)

docker pull docker.iflydocs.com/docsoffice:$tag

指定cpu架构拉取镜像

docker pull docker.iflydocs.com/docsoffice:$tag --platform linux/amd64

查看镜像详细信息

docker manifest inspect docker.iflydocs.com/docsoffice:v1.50

yuwb@cattery test % docker manifest inspect docker.iflydocs.com/docsoffice:v1.50
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 4521,
"digest": "sha256:cdba3a7ca7a0a063ccee798b99af7a9ca310788ae58f1e83b174840ca561db4e",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 4521,
"digest": "sha256:35db235d0cf7bf6e07654899f4d299dd382c97b44eaa0cb3e6de0fd1cd2502c9",
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}
可以看到支持的cpu架构

六、质效平台配置

build
image.png
check docsoffice-docker服务端代码
拉取前端代码,前端打包。
将前端打包产物放入服务端文件夹中。
压缩并上传制品

deploy
解压制品,然后执行build.sh脚本

#!/bin/bash
echo "mv folder to build path"
rm -rf /data/build/docsoffice-docker.zip
rm -rf /data/build/docsoffice-docker
mv docsoffice-docker.zip /data/build/
cd /data/build/
echo "start deoploy"

#删除之前的产物
echo "rm temp folder"

#解压当前产物
echo "unzip pack file"
unzip -qo $dist_zip

#删除docker文件夹
echo "build docker images"
cd docsoffice-docker
#生成版本号(20221208)
tag=$(date "+%Y%m%d")
#忽略日志,质效平台会检测error输出
bash build.sh $tag >/dev/null 2>&1
echo "check docker manifest"
docker manifest inspect  docker.iflydocs.com/docsoffice:$tag
echo "build sucess"

build.sh

start_time=`date +%s`
echo '构建目录:'$( pwd)
#接收版本号,如果为空设置为$(date "+%Y%m%d")
if  [ ! -n "$1" ] ;then
    tag=$(date "+%Y%m%d")
else
    tag=$1
fi
echo '镜像版本:' $tag
export DOCKER_CLI_EXPERIMENTAL=enabled
echo 'docker版本:'
docker --version
echo '是否开启实验特性:'
docker version -f '{{.Server.Experimental}}'
echo 'create buildx builder'

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx rm builder
docker buildx create --name builder --platform linux/arm64,linux/arm,linux/arm/v6,linux/arm/v8,linux/amd64,linux/386 --driver docker-container --use
docker buildx inspect builder --bootstrap

echo 'docker buildx版本:'
docker buildx version
docker buildx ls | grep builder

sudo find ./ -name ".DS_Store" -depth -exec rm {} \;

echo '登录镜像仓库:'
docker login docker.iflydocs.com -u admin -p xx
echo '开始构建并上传:'
docker buildx build --platform linux/amd64,linux/arm64 --push -t docker.iflydocs.com/docsoffice:$tag .

echo '镜像信息:'
echo 'docker.iflydocs.com/docsoffice:'$tag
docker manifest inspect  docker.iflydocs.com/docsoffice:$tag
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.