如何保存容器的任何更改?

时间:2019-06-03 07:54:07

标签: docker kubernetes cloud

如果我有一个ubuntu容器,并且在容器被销毁后使用ssh制作一个文件,或者我重新启动该容器,则新文件被销毁了,因为kubernetes加载了不包含我的更改的ubuntu映像。 我的问题是我该怎么做保存任何更改? 我知道可以做到,因为某些云提供商可以这样做。

例如:

ssh ubuntu@POD_IP
ls 

重启后我有

ls

Dockerfile什么也不显示

但是我要保存当前状态。 我想自动

如果我使用docker commit,则无法控制我的图像,因为它可以生成数百个图像。因为我应该通过每次更改来制作图像。

如果我要使用存储空间,则应装入/ 。但是kubernetes不允许我挂载/。它给了我这个错误

  

错误:来自守护程序的错误响应:无效的卷规范:'/var/lib/kubelet/pods/26c39eeb-85d7-11e9-933c-7c8bca006fec/volumes/kubernetes.io~rbd/pvc-d66d9039-853d-11e9- 8aa3-7c8bca006fec:/':类型为“ bind”的装载配置无效:无效的规范:目标不能为“ /”

2 个答案:

答案 0 :(得分:1)

Docker和Kubernetes不能这样工作。永远不要运行docker commit。通常,您在容器/吊舱中几乎不需要ssh守护程序,并且需要做一些特殊的工作以使sshd和主进程都运行(并进行额外的工作以使sshd实际上是安全的)。如果只卸下这些容器,您的容器将变得更简单,更安全。

通常的过程涉及称为不可变基础结构的技术。您永远不会在现有容器中更改代码;取而代之的是,您更改配方以构建容器,并告诉集群管理器您想要更新,它将删除并重新构建所有内容。要对在Kubernetes容器中运行的应用程序进行更改,您通常需要:

  1. 完全不涉及Docker或Kubernetes,在本地进行并测试代码更改。
  2. docker build包含代码更改的新图像。它应该具有唯一的标记,通常是日期戳或源控件提交ID。
  3. (可选,但推荐)docker run在本地镜像并运行集成测试。
  4. docker push将图像导入注册表。
  5. 在Kubernetes部署规范中更改image标记,然后kubectl apply(或helm upgrade)对其进行更改。

通常,您将有一个自动化的连续集成系统执行步骤2-4,而持续部署系统执行最后一步;您只需要提交并推动经过测试的更改即可。

请注意,当您在步骤3中本地docker run映像时,您正在运行与生产Kubernetes系统完全相同的映像。抵制将本地源树装入其中并尝试在那里进行开发的诱惑!如果此时测试失败,则将其简化为最简单的失败案例,为其编写单元测试,然后将其修复在本地树中。重建图像不会特别昂贵。

您的问题提示未修改的ubuntu图片。除了一些非常早期的“ hello world”类型的实验之外,除了Dockerfile的FROM行之外,几乎没有其他理由可以使用它。如果还没有,则应该完成official Docker tutorial on building and running custom images的工作,这将适用于任何群集系统。 (如果您已经以协调员的身份熟悉Kubernetes,请跳过所有涉及Docker Swarm的后续教程。)

答案 1 :(得分:0)

您可以尝试使用import React from 'react'; import env from './environment'; import { graphql, QueryRenderer } from 'react-relay'; const App = () => ( <QueryRenderer environment={env} query={graphql` query AppQuery{ allPersons { id name } } `} variables={{}} render={({error, props}) => { if (error) { return <div>Error!</div>; }if(!props){ return <div>Loading...</div>; } return <div>user</div>; }} /> ); export default App; ,但是您需要确保Kubernetes集群能够获取您提交的最新映像-

docker commit

这将从容器中创建一个新图像,您可以将其提供给Kubernetes。

Ref-https://docs.docker.com/engine/reference/commandline/commit/

更新1 -

如果要自动执行此操作,可能需要将更改的状态或文件存储在NFS等集中式文件系统中,然后在需要时使用相关权限将其安装到所有正在运行的容器中。

K8s参考-https://kubernetes.io/docs/concepts/storage/persistent-volumes/