如果资源已经存在,尝试通过oc create
基于文件创建一组资源将失败。
根据此处的文档,oc create
应:
解析配置文件并创建一个或多个OpenShift Enterprise对象忽略任何现有资源
(强调矿)。
我看不到这个命令或全局的任何配置选项会改变这种行为,在我看来这与文档背道而驰。
我运行的命令是oc create -f some.file
输出为:
Error from server: services 'my-app' already exists
Error from server: buildconfigs 'my-app' already exists
Error from server: imagestreams 'my-app' already exists
Error from server: deploymentconfigs 'my-app' already exists
Error from server: routes 'my-app' already exists
Error from server: secrets 'my-app' already exists
它还使用非零退出代码退出,所以它不仅仅是一个警告。我是不是遗漏了一些明显的东西,或者误解了文档中的内容?
我只想能够应用这个文件,并在之后确保OpenShift项目的状态。
文档的措辞可能有点糟糕。它所说的是,如果你试图创建一个特定类型的对象,而具有该名称的该类型的对象已经存在,那么你创建新对象的尝试将被忽略。
如果您试图从相同的原始资源定义创建应用程序的多个实例,就会出现这种情况。使用一组原始资源定义中的oc create -f
无法覆盖命令行中的名称,因此第二次部署是不同的。
如果要从同一资源定义创建多个实例,则需要将定义转换为模板并对名称进行参数化,以便为不同的实例传递不同的名称。那样就不会发生冲突。
此外,当您创建一组资源时,通常最好在所有资源类型中使用同一个名称,而不是对每种类型使用不同的名称,例如,对所有资源只使用"我的应用程序名称",而不是单独使用"my buildconfig"one_answers"my imagestream"。
更重要的是,您需要确保在所有标签上添加具有相同键/值的标签,这样就可以很容易地将它们一起使用,包括一次性删除所有标签。
您尝试部署的应用程序类型是什么?我可以向您介绍一些可以作为指南的示例模板。
更新1
如果您希望能够运行oc create -f
,并且在资源已经存在的情况下不抱怨,但在资源不存在的时候创建它们,请改用oc apply -f
。
如何使用oc replace
:
oc replace --filename file.yml --force
运行oc delete <resource> <name>
。示例:oc delete configmap my-configs
然后运行您的命令-f和";oc替换";对我不起作用。