前言
之前为了优化docker打包速度,把一些下载速度慢和容易出错的依赖放进了容器镜像,当时弄完了就没管,今天回头来试的时候发现流程全忘了,又要从头弄起,网上一搜全是和自己需求关系不大的复制粘贴文章,干脆就写下来免得下次又忘了方便找。
需求
其实很简单,我要做的就是找到一个合适的镜像,经过自己改造之后能够最大程度的减小dockerfile环境的搭建,比起在dockerfile里去搭一个我要的环境,我更倾向于搭好下次直接用,毕竟我也不是什么极致精简党。
我的流程主要分为以下几个步骤:pull一个基础镜像——>运行镜像——>打包成一个新镜像——>上传镜像——>使用新镜像运行服务。
1、Pull基础镜像
如何找到一个你期望的基础镜像,打开docker hub并登录(很多教程从注册开始讲起,我必须吐槽一下,真的不是凑篇幅的吗,这也要教?)
在最上方搜索栏输入你想搜索的镜像关键词,比如我之前搭过一个grpc的环境,当时用的是别人写的node-python镜像,后来又自己写了一个上传了,我这次准备弄一个python(没错,是为新坑做准备),所以搜python
从版本中找到一个自己需要的版本,上一篇文章我讲过了,要用到python 3.9版本,所以选择了3.9.16-bullseye(稳定版本),docker pull
2、运行镜像
这个镜像里没有对应的脚本,CMD不会持续运行,如果直接用docker run 执行的话会发现状态是 Exited(0) ,这里应该使用 -dt 参数:
docker run --name python -dt python:3.9.16-bullseye
其中-d 代表后台运行(Run container in background and print container ID),-t 代表分配一个伪TTY(Allocate a pseudo-TTY),大概就是提供了一种能够访问docker内部的方式的意思
运行成功后,进入容器内部:
docker exec -it python bash
安装你需要的环境,这里就不详细讲了,当linux用就行。
3、打包成一个新镜像
docker commit [container id or container name] [image name:[tag name]]
这里名字自己起一个,因为上面运行的容器名字叫python,所以命令应该是:
docker commit python segment-python-cpu:1.0.0
4、上传镜像
-
将本地的镜像打标签,标签名与远程仓库的一致,其中用户名要与dockerhub名称一致,比如我的用户名叫qperable:
# 本地的镜像:monsoira:latest # 远程仓库的镜像:monsoir/monsoira:1.0 docker tag segment-python-cpu:1.0.0 qperable/segment-python-cpu:1.0.0
-
将上面的本地镜像推送到远程仓库
# 需要先登陆 docker push qperable/segment-python-cpu:1.0.0
5、使用新镜像运行服务
dockerfile文件里加上这一条用的就是新镜像了