如何在Kubernetes中从正在运行的容器创建一个镜像?

9

我希望能像在Docker中一样对Kubernetes pod中运行的容器执行docker commit

卷快照不满足我的要求,因为我想要快照容器的完整状态,而不仅仅是某个路径下挂载的数据。

我需要这个功能是因为我向容器提供了(可信的)用户根访问权限,并且我想能够提供一种方法,在上一个快照之前回滚容器时,不会丢失他们安装的任何软件包(或其他更改)。

似乎已经提出相关的功能请求,但没有得到实现。

我正在使用Google Kubernetes Engine,但我准备迁移到另一个易于支持此功能的提供商。


1
您应该能够从主机运行Docker命令,并像通常一样将容器保存为镜像。 - Yonah Dissen
2
在托管集群中,访问主机/节点并不直接。例如,通过 kubectl 具有此功能非常有帮助。 - imriss
1个回答

2
在名为guest的容器内运行bash shell:
[root@host ~]# docker run -i -t --name guest oraclelinux:6.6 /bin/bash
[root@guest ~]#

如果你使用网络代理,按照《Oracle Linux 7版本管理员指南》中的说明在虚拟机上编辑yum配置。

安装httpd软件包:
[root@guest ~]# yum install httpd

如果需要,在客户端上创建要显示在/var/www/html目录层次结构下的Web内容。

使用主机上的docker stop命令退出客户端:

[root@host ~]# docker stop guest
guest

使用您停止的容器的ID创建标签为v1的镜像mymod/httpd:
[root@host ~]# docker commit -m "ol6 + httpd" -a "A N Other" \
`docker ps -l -q` mymod/httpd:v1
8594abec905e6374db51bed1bfb208804cfb60d96b285efb897db581a01676e9

使用-m-a选项来记录镜像及其作者。该命令将返回新镜像ID的完整版本。
如果使用docker images命令,则新镜像现在会出现在列表中:
  [root@host ~]# docker images
    REPOSITORY    TAG         IMAGE ID       CREATED       VIRTUAL SIZE
    mymod/httpd   v1          8594abec905e   2 minutes ago 938.5 MB
    oraclelinux   6           9ac13076d2b5   5 days ago    319.4 MB
    oraclelinux   6.6         9ac13076d2b5   5 days ago    319.4 MB
    oraclelinux   latest      073ded22ac0f   5 days ago    265.2 MB
    oraclelinux   7           073ded22ac0f   5 days ago    265.2 MB
    oraclelinux   7.0         073ded22ac0f   5 days ago    265.2 MB

删除名为guest的容器。

    # docker rm guest
    guest

现在您可以使用新的镜像创建一个作为Web服务器工作的容器,例如:

 # docker run -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND
 7afbbefec5191f632e149f85ae10ed0ba88f1c545daad18cb930e575ef6a3e63

2
通过运行 kubectl describe pod 命令查找您的 Pod 运行在哪个主机上,然后使用 ssh 登录到该主机,在主机上直接执行 docker 命令。最后将您的镜像推送到 Docker Hub 以保存您的镜像。 - James Knott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接