自动化shell脚本下载_使用此Shell脚本自动化现场演示

自动化shell脚本下载

我在10月的LISA19上发表了有关多体系结构容器映像的演讲 ,其中包括一个冗长的实时演示。 我决定不使用30个以上的命令并要冒输入错误的风险,而是决定使用Shell脚本使演示自动化。

该脚本模仿了显示为输入/输出的内容,并在后台运行了真实的命令,在各个地方都暂停了,因此我可以叙述发生了什么。 我对脚本的结果和舞台效果感到非常满意。 我演讲的脚本及配套材料都可以在GitHub的下一个Apache 2.0许可。

剧本

 #!/bin/bash 

set -e

IMG =thedoh / lisa19
REGISTRY =docker.io
VERSION =19.10.1

# Plan B with GCR:
#IMG=dulcet-iterator-213018
#REGISTRY=us.gcr.io
#VERSION=19.10.1


pause ( ) {
local step = " ${1} "
ps1
echo -n "# Next step: ${step} "
read
}

ps1 ( ) {
echo -ne "\033[01;32m ${USER} @ $(hostname -s) \033[01;34m $(basename $(pwd) ) \$ \033[00m"
}

echocmd ( ) {
echo " $(ps1) $@"
}

docmd ( ) {
echocmd $ @
$ @
}

step0 ( ) {
local registry = " ${1} " img = " ${2} " version = " ${3} "
# Mindful of tokens in ~/.docker/config.json
docmd grep experimental ~ / .docker / config.json

docmd cd ~ / go / src / github.com / lisa / lisa19-containers

pause "This is what we'll be building"
docmd export REGISTRY = ${registry}
docmd export IMG = ${img}
docmd export VERSION = ${version}
docmd make REGISTRY = ${registry} IMG = ${img} VERSION = ${version} clean
}

step1 ( ) {
local registry = " ${1} " img = " ${2} " version = " ${3} "

docmd docker build --no-cache --platform =linux / amd64 --build-arg = GOARCH =amd64 -t ${REGISTRY} / ${IMG} :amd64- ${VERSION} .
pause "ARM64 image next"
docmd docker build --no-cache --platform =linux / arm64 --build-arg = GOARCH =arm64 -t ${REGISTRY} / ${IMG} :arm64- ${VERSION} .
}

step2 ( ) {
local registry = " ${1} " img = " ${2} " version = " ${3} " origpwd =$ ( pwd ) savedir =$ ( mktemp -d ) jsontemp =$ ( mktemp -t XXXXX )
chmod 700 $jsontemp $savedir
# Set our way back home and get ready to fix our arm64 image to amd64.
echocmd 'origpwd=$(pwd)'
echocmd 'savedir=$(mktemp -d)'
echocmd "mkdir -p \$ savedir/change"
mkdir -p $savedir / change &>/ dev / null
echocmd "docker save ${REGISTRY} / ${IMG} :arm64- ${VERSION} 2>/dev/null 1> \$ savedir/image.tar"
docker save ${REGISTRY} / ${IMG} :arm64- ${VERSION} 2 >/ dev / null 1 > $savedir / image.tar
pause "untar the image to access its metadata"

echocmd "cd \$ savedir/change"
cd $savedir / change
echocmd tar xf \ $savedir / image.tar
tar xf $savedir / image.tar
docmd ls -l

pause "find the JSON config file"
echocmd 'jsonfile=$(jq -r ".[0].Config" manifest.json)'
jsonfile =$ ( jq -r ".[0].Config" manifest.json )

pause "notice the original metadata says amd64"
echocmd jq '{architecture: .architecture, ID: .config.Image}' \ $jsonfile
jq '{architecture: .architecture, ID: .config.Image}' $jsonfile

pause "Change from amd64 to arm64 using a temp file"
echocmd "jq '.architecture = \" arm64 \" ' \$ jsonfile > \$ jsontemp"
jq '.architecture = "arm64"' $jsonfile > $jsontemp
echocmd / bin / mv -f -- \ $jsontemp \ $jsonfile
/ bin / mv -f -- $jsontemp $jsonfile

pause "Check to make sure the config JSON file says arm64 now"
echocmd jq '{architecture: .architecture, ID: .config.Image}' \ $jsonfile
jq '{architecture: .architecture, ID: .config.Image}' $jsonfile

pause "delete the image with the incorrect metadata"
docmd docker rmi ${REGISTRY} / ${IMG} :arm64- ${VERSION}

pause "Re-compress the ARM64 image and load it back into Docker, then clean up the temp space"
echocmd 'tar cf - * | docker load'
tar cf - * | docker load

docmd cd $origpwd
echocmd "/bin/rm -rf -- \$ savedir"
/ bin / rm -rf -- $savedir &>/ dev / null
}

step3 ( ) {
local registry = " ${1} " img = " ${2} " version = " ${3} "
docmd docker push ${registry} / ${img} :amd64- ${version}
pause "push ARM64 image to ${registry} "
docmd docker push ${registry} / ${img} :arm64- ${version}
}

step4 ( ) {
local registry = " ${1} " img = " ${2} " version = " ${3} "
docmd docker manifest create ${registry} / ${img} : ${version} ${registry} / ${img} :arm64- ${version} ${registry} / ${img} :amd64- ${version}

pause "add a reference to the amd64 image to the manifest list"
docmd docker manifest annotate ${registry} / ${img} : ${version} ${registry} / ${img} :amd64- ${version} --os linux --arch amd64
pause "now add arm64"
docmd docker manifest annotate ${registry} / ${img} : ${version} ${registry} / ${img} :arm64- ${version} --os linux --arch arm64
}

step5 ( ) {
local registry = " ${1} " img = " ${2} " version = " ${3} "
docmd docker manifest push ${registry} / ${img} : ${version}
}


step6 ( ) {
local registry = " ${1} " img = " ${2} " version = " ${3} "
docmd make REGISTRY = ${registry} IMG = ${img} VERSION = ${version} clean

pause "ask docker.io if ${img} : ${version} has a linux/amd64 manifest, and run it"
docmd docker pull --platform linux / amd64 ${registry} / ${img} : ${version}
docmd docker run --rm -i ${registry} / ${img} : ${version}

pause "clean slate again"
docmd make REGISTRY = ${registry} IMG = ${img} VERSION = ${version} clean

pause "now repeat for linux/arm64 and see what it gives us"
docmd docker pull --platform linux / arm64 ${registry} / ${img} : ${version}
set +e
docmd docker run --rm -i ${registry} / ${img} : ${version}
set -e
if [ [ $ ( uname -s ) == "Darwin" ] ] ; then
pause "note about Docker on Mac and binfmt_misc: binfmt_misc lets a mac run arm64 binaries in the Docker VM"
fi
}

pause "initial setup"
step0 ${REGISTRY} ${IMG} ${VERSION}
pause "1 build constituent images"
step1 ${REGISTRY} ${IMG} ${VERSION}

pause "2 fix ARM64 metadata"
step2 ${REGISTRY} ${IMG} ${VERSION}

pause "3 push constituent images up to docker.io"
step3 ${REGISTRY} ${IMG} ${VERSION}

pause "4 build the manifest list for the image"
step4 ${REGISTRY} ${IMG} ${VERSION}

pause "5 Push the manifest list to docker.io"
step5 ${REGISTRY} ${IMG} ${VERSION}

pause "6 clean slate, and validate the list-based image"
step6 ${REGISTRY} ${IMG} ${VERSION}

docmd echo 'Manual steps all done!'
make REGISTRY = ${REGISTRY} IMG = ${IMG} VERSION = ${VERSION} clean &>/ dev / null

翻译自: https://opensource.com/article/20/2/live-demo-script

自动化shell脚本下载


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部