如果我有一个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”的装载配置无效:无效的规范:目标不能为“ /”
答案 0 :(得分:1)
Docker和Kubernetes不能这样工作。永远不要运行docker commit
。通常,您在容器/吊舱中几乎不需要ssh守护程序,并且需要做一些特殊的工作以使sshd和主进程都运行(并进行额外的工作以使sshd实际上是安全的)。如果只卸下这些容器,您的容器将变得更简单,更安全。
通常的过程涉及称为不可变基础结构的技术。您永远不会在现有容器中更改代码;取而代之的是,您更改配方以构建容器,并告诉集群管理器您想要更新,它将删除并重新构建所有内容。要对在Kubernetes容器中运行的应用程序进行更改,您通常需要:
docker build
包含代码更改的新图像。它应该具有唯一的标记,通常是日期戳或源控件提交ID。docker run
在本地镜像并运行集成测试。docker push
将图像导入注册表。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/