Kubernetes:kubectl exec命令与C#程序的行为不同

2g32fytz  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(106)

我有一个Kubernetes集群,其中有一个部署工作负载资源和一个挂载的存储(持久卷声明)。部署资源运行一个包含Minecraft服务器的容器,其中包含文件server.properties

通缉行为

我想从C#应用程序中使用kubectl execsed命令更改该文件的值:

kubectl exec deployment/test-mc -- sed -i 's|^gamemode=.*|gamemode=creative|' server.properties

字符串
如果我从终端(而不是从应用程序)启动这个命令,它工作得很好,文件会用新值更新。检查我是否使用了kubectl exec deployment/test-mc -- cat server.properties

问题

当我尝试从C#应用程序启动相同的命令时,它不工作。这是我用来运行命令的代码:

private string ExecCommand(string serverName, string command)
{
    var processStartInfo = new ProcessStartInfo()
    {
        FileName = "kubectl",
        Arguments = $"exec deployment/{serverName} -- {command}",
        RedirectStandardOutput = true,
        UseShellExecute = false
    };

    var process = new Process()
    {
        StartInfo = processStartInfo
    };

    process.Start();

    var commandOutput = process.StandardOutput.ReadToEnd();
    process.WaitForExit();

    return commandOutput;
}

public void ChangeGamemode(string serverName, string newGamemode)
{
    Console.WriteLine($"Command: touch test.txt");
    var commandOutput = ExecCommand(serverName, $"sed -i 's|^gamemode=.*|gamemode={newGamemode}|' server.properties");
    Console.WriteLine($"Output: {commandOutput}");
}


但是当我使用kubectl exec deployment/test-mc -- cat server.properties检查server.properties的内容时,该值仍然没有改变。

更多信息

我确信我可以访问部署资源,因为我尝试从C#应用程序创建文件,并且成功了:

// From C# Application
ExecCommand(serverName, "touch test.txt");


来自终端的文件列表:

> kubectl exec deployment/test-mc -- ls -la
total 46748
[...]
-rw-rw-rw-  1 minecraft minecraft     1313 Jul  3 10:46 server.properties
-rw-r--r--  1 root      root             0 Jul  3 11:23 test.txt
[...]


任何帮助将不胜感激:)

jgwigjjp

jgwigjjp1#

这一行:

var commandOutput = ExecCommand(serverName, "sed -i 's|^gamemode=.*|gamemode={newGamemode}|' server.properties");

字符串
你是不是忘了把$放在"sed -i 's|^gamemode=.*|gamemode={newGamemode}|' server.properties"前面?
它应该是:

var commandOutput = ExecCommand(serverName, $"sed -i 's|^gamemode=.*|gamemode={newGamemode}|' server.properties");

ibrsph3r

ibrsph3r2#

更新:我仍然没有弄清楚为什么它不工作,但设法找到了一个解决方案。

解决方案

我创建了一个shell脚本,它可以完成我需要的任务:更新server.properties文件的属性:

#!/bin/bash

property=$1 # property to change
newVal=$2   # value to assign to the property

sed -i "s/^${property}=.*/${property}=${newVal}/" server.properties

字符串
我从C#应用程序调用它,传递我需要的值,如下所示:

ExecCommand(serverName, $"/bin/bash update-server-property.sh gamemode {newValue}");


这样,文件就会得到更新,因为它应该:)

相关问题