此教程以个人博客为例,提供些自己使用的技巧,并分享几个以前用过的示例
一般需要两个镜像
基础镜像,里面安装好打包环境,并下载依赖包,可以写脚本定时更新基础镜像
服务运行环境,比如我博客需要个 nginx 服务,golang 的话选好系统直接运行就行
1 基础镜像制作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 FROM node:16.14 .2 -alpine3.15 RUN npm config set registry http://registry.npm.taobao.org/ && \ npm i -g npm@8.8 .0 && \ npm i -g hexo@5.4 .2 && \ mkdir /opt/blog && \ cd /opt/blog && \ hexo i && \ rm -rf source _config.landscape.yml _config.yml && \ npm uninstall hexo-theme-landscape && \ npm cache clean --force COPY source_data/ /opt/blog/ WORKDIR /opt/blog/ RUN npm i
1.1 基础镜像可以加上清空缓存命令来减少镜像体积 一些常见的包管理器删除缓存的方法:
yum
yum clean all
dnf
dnf clean all
npm
npm cache clean –force
pip
rm -rf ~/.cache/pip/*
apt-get
apt-get clean
2 运行业务容器镜像制作 1 2 3 4 5 6 7 8 9 10 11 12 FROM ccr.ccs.tencentyun.com/ccops/hexo:5.4 .2 -1 AS build-env ADD . /opt/blog/source/_posts WORKDIR /opt/blog/source/_posts RUN rm -rf /opt/blog/source/_posts/Dockerfile /opt/blog/source/_posts/deployment.yaml RUN hexo g FROM ccr.ccs.tencentyun.com/ccops/nginx:1.21 .6 -alpine RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY --from=build-env /opt/blog/public/ /opt/blog EXPOSE 80 WORKDIR /opt/blog CMD ["nginx" ,"-g" ,"daemon off;" ]
2.1 多阶段构建
能复用 Pipeline,不用每个语言都写个打包 task
减少体积,业务运行容器只存在代码
保证构建镜像的安全性,最终构建的镜像将不包含任何源代码信息
3 维护镜像 3.1 下载工具 dive · GitHub
3.2 安装
因为安装到了/usr/local/bin/dive 下,可能会出现直接执行不了的情况,指定路径或者挪到/usr/bin 下
rpm -ivh dive_0.10.0_linux_amd64.rpm
3.3 使用 dive 镜像名或镜像 id
可以看到比较重要的信息,我哪层用的空间哪个文件比较大
3.4 快捷键
快捷键
描述
Ctrl + C
退出
Tab
在层和文件树视图之间切换
Ctrl + F
筛选
PageUp
向上滚动页面
PageDown
向下滚动页面
Ctrl + A
镜像视图:查看聚合图像修改
Ctrl + L
镜像视图:查看当前图层修改
Space
文件树视图:折叠/取消折叠目录
Ctrl + Space
文件树视图:折叠/展开所有目录
Ctrl + A
文件树视图:显示/隐藏添加的文件
Ctrl + R
文件树视图:显示/隐藏已删除的文件
Ctrl + M
文件树视图:显示/隐藏修改的文件
Ctrl + U
文件树视图:显示/隐藏未修改的文件
Ctrl + B
文件树视图:显示/隐藏文件属性
PageUp
Filetree 视图:向上滚动页面
PageDown
Filetree 视图:向下滚动页面
4 其他一些例子 4.1 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 FROM harbor.rx.cn:80 /rongxin/maven:3.5 .0 -jdk-8 -alpine AS buildADD ./pom.xml pom.xml ADD ./src src/ mvn clean package -U -Dmaven.test.skip=true FROM harbor.rx.cn:80 /rongxin/basic:java8RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone COPY --from=builder target/*.jar /var/app/ ENV JVM_PARAMS="-Xmx4096m -Xms4096m -Xmn1536m -Xss256k -XX:+UseConcMarkSweepGC -XX:+UseCompressedClassPointers -XX:+PrintGCDetails -XX:+PrintGC -XX:+PrintGCTimeStamps -Xloggc:/var/app/logs/$APPLICATION_NAME/gc/gc.log -verbose:gc" EXPOSE 8080 EXPOSE 5000 ENTRYPOINT ["/sbin/tini" ,"--" ] CMD java -jar -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE $JVM_PARAMS $JAVA_START $JAVA_AGENT /var/app/*.jar
4.2 Golang 1 2 3 4 5 6 7 8 9 10 11 12 13 FROM ccr.ccs.tencentyun.com/ccops/golang:1.17 .8 AS build-env ENV GOPROXY https://goproxy.cnADD . /go/src/app WORKDIR /go/src/app RUN go mod tidy RUN GOOS=linux GOARCH=386 go build -v -o /go/src/app/app-server FROM ccr.ccs.tencentyun.com/ccops/alpine:3.15 .3 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \ apk add -U tzdata RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY --from=build-env /go/src/app/app-server /usr/local/bin/app-server EXPOSE 8080 CMD [ "app-server" ]