在日常工作中经常会遇到一个现有的镜像,需要对这个镜像进行改造,但是又没有这个构建这个镜像的dockerfile,在这种情况下如何制作出符合自己要求的新镜像呢,以下是我的制作思路,仅供参考和自我记录使用。

一、启动并进入原有镜像

在运行容器时,可以加​​-dit​​参数,并在后面增加一个驻留在进程中长期运行的命令(如tail -f /dev/null)就可以保证容器不关闭了

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run -dit --name ubuntu2 ubuntu:19.10 tail -f /dev/null 
a0d3c58fc68b139f63355594dd91c2d047b84a3d56880418eedcd8fedb6307b6
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0d3c58fc68b ubuntu:19.10 "tail -f /dev/null" 5 seconds ago Up 4 seconds ubuntu2

使用 docker exec -it  CONTAINER_ID  shell类型(如bash) 来进入容器并保持终端

docker exec -it 49fb89680eeb645840e512aae797c9a4af2bd27362b07360a77744f5acc47bea /bin/sh
sh-4.2#

二、修改通过镜像启动的容器

进入容器后可以在容器中进行操作,完成自己的需求

有时在离线环境下,容器内无法直接通过wget或yum等命令安装软件,则可以使用​​docker cp​​命令,从外部拷贝安装包或二进制文件至容器内

dokcer cp 需要拷贝的文件 容器ID:容器内目录

三、制作并导出镜像

当容器内修改完毕后,我们可以重新打开一个终端,利用​​docker commit​​命令,将现有容器制作成镜像

docker commit 容器ID harbor.cfuture.shop/c2f/fe-build:v8 

镜像制作完成后,可以通过​​docker save​​命令将镜像导出成tar包,至此,无Dockerfile制作镜像就完成了

docker save harbor.cfuture.shop/c2f/fe-build:v8 -o febuild.tar