如何优雅的使用DockerFile

1003 字
5 分钟
如何优雅的使用DockerFile

此教程以个人博客为例,提供些自己使用的技巧,并分享几个以前用过的示例

一般需要两个镜像

  • 基础镜像,里面安装好打包环境,并下载依赖包,可以写脚本定时更新基础镜像
  • 服务运行环境,比如我博客需要个 nginx 服务,golang 的话选好系统直接运行就行

1 基础镜像制作#

FROM node:16.14.2-alpine3.15 # 获取npm环境镜像
RUN npm config set registry http://registry.npm.taobao.org/ && \ # 修改镜像源,要不下依赖包特别慢
npm i -g npm@8.8.0 && \ # 更新npm
npm i -g hexo@5.4.2 && \ # 安装hexp
mkdir /opt/blog && \ # 创建博客打包目录
cd /opt/blog && \ # 进入博客目录
hexo i && \ # hexo初始化
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 基础镜像可以加上清空缓存命令来减少镜像体积#

一些常见的包管理器删除缓存的方法:

yumyum clean all
dnfdnf clean all
npmnpm cache clean —force
piprm -rf ~/.cache/pip/*
apt-getapt-get clean

2 运行业务容器镜像制作#

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 # 将上个构建的产物复制到当前目录,名字一样(build-env)
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

可以看到比较重要的信息,我哪层用的空间哪个文件比较大

image-20220510143407087
image-20220510143407087

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文件树视图:显示/隐藏文件属性
PageUpFiletree 视图:向上滚动页面
PageDownFiletree 视图:向下滚动页面

4 其他一些例子#

4.1 Java#

FROM harbor.rx.cn:80/rongxin/maven:3.5.0-jdk-8-alpine AS build
# 拷贝源代码
ADD ./pom.xml pom.xml
ADD ./src src/
# 构建jar包,
mvn clean package -U -Dmaven.test.skip=true
FROM harbor.rx.cn:80/rongxin/basic:java8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
# 拷贝程序
COPY --from=builder target/*.jar /var/app/
# 配置jvm
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 # 远程调试接口
# 使用tini
ENTRYPOINT ["/sbin/tini","--"]
# 配置功能,不需要的删除就行
# JAVA_DEBUG_PROT,远程debug
# JAVA_AGENT,SkyWalking客户端
CMD java -jar -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE $JVM_PARAMS $JAVA_START $JAVA_AGENT /var/app/*.jar

4.2 Golang#

FROM ccr.ccs.tencentyun.com/ccops/golang:1.17.8 AS build-env
ENV GOPROXY https://goproxy.cn
ADD . /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" ]

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

如何优雅的使用DockerFile
https://ccops.cc/posts/6c0850f4/
作者
蹦蹦站长
发布于
2021-10-11
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
蹦蹦站长
一个养兔子的运维
公告
感谢你的来访!希望在这里能找到对你有用的内容!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
81
分类
6
标签
45
总字数
88,456
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录