一、基于环境ubuntu 20.2
要求系统内核版本>4.8 否则qemu环境安装有问题,需要升级内核版本。
安装docker
Docker version 20.10.7, build f0df350
开启实验特性
vi /etc/docker/dameon.json添加配置
"experimental": true
重启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
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.