我有一个在码头集装箱里运行的常规程序。我需要dmidecode命令的输出。但即将到来的是空白。
去:
函数main() {
cmd := exec.Command("dmidecode","-t 1")
x,_ := cmd.Output()
fmt.Println("output =======", string(x))}
码头经营:
docker运行--设备/dev/mem:/dev/mem -cap SYS_RAWIO -p 8086:8086 -it my_img:1.0.1
我在这里错过了什么?
更新:
在我在Dockerfile中添加了以下内容之后,上面的内容在docker中起了作用:
来自高山:最新运行apk --无缓存-更新--详细添加grep bash dmidecode &&
rm -rf /var/cache/apk/* /tmp/* /sbin/halt /sbin/poweroff /sbin/reboot
并在下面的docker撰写文件:
特权:真的
,但是当试图在kubernetes中使用上面的内容时,它无法获取半编码输出.。
我们会非常感谢你的帮助。
发布于 2021-11-23 17:14:20
我在这里错过了什么?
首先,错误处理。
x,_ := cmd.Output()千万不要忽视围棋中的一个错误。与像Pyhton这样的语言不同,也没有例外--处理错误返回值是您唯一的机会来判断出什么地方出了问题。
其次,您还忽略了命令的标准输出流。当命令执行不起作用时,这很可能包含有用的错误消息,因此将其作为错误值的一部分提供。 (如果还没有在Cmd配置中捕获)。错误处理的一部分应该是对该错误值执行类型断言 (如果不是零),如果它是有效的*exec.ExitError,如果该类型的断言成功,则检查它的Stderr场以获得错误消息。
第三,看着你的命令,我可以看出你犯了一个简单的错误:
cmd := exec.Command("dmidecode","-t 1")在shell中,空格分隔参数。但是这里没有shell;您将-t 1作为一个参数传递给dmidecode。您应该将它们作为单独的论点传递,几乎可以肯定:
cmd := exec.Command("dmidecode","-t", "1")最后,您已经找到了不能在码头集装箱上运行dmidecode,但是一定要阅读并理解所接受的答案。然后,将您的停靠容器配置为能够在不运行dmidecode的情况下运行。一旦它在命令行中工作,相同的对接器配置也应该允许它在Go调用下工作。
https://stackoverflow.com/questions/70084912
复制相似问题