如何通过Docker.DotNet执行带&&的Docker Exec Bash命令?
解决Docker.DotNet检查容器内文件存在性的问题
问题核心是Docker.DotNet的Exec命令参数需要按数组拆分传递,而不是直接把Shell里的整串命令丢进去。你之前的写法会让bash把整个"sudo test -f ... && echo true"当作一个要执行的文件名,自然会报“找不到文件”。
正确的实现方式如下:
代码示例(C#)
using Docker.DotNet; using Docker.DotNet.Models; var dockerClient = new DockerClientConfiguration(new Uri("unix:///var/run/docker.sock")).CreateClient(); var containerName = "你的容器名称"; // 关键:将命令拆分为数组,bash -c 后面的整个判断逻辑作为单个参数 var execParams = new ExecCreateParameters { Cmd = new List<string> { "/bin/bash", "-c", "sudo test -f /repositories/gubbins/file.txt && echo true" }, AttachStdout = true, AttachStderr = true }; // 创建执行实例 var execResponse = await dockerClient.Exec.ExecCreateContainerAsync(containerName, execParams); // 读取执行结果 var stream = await dockerClient.Exec.StartExecContainerAsync(execResponse.ID, new ExecStartParameters()); var reader = new StreamReader(stream); var output = await reader.ReadToEndAsync(); // 处理结果:如果输出包含"true"则文件存在 bool fileExists = output.Trim() == "true";
额外注意事项
- 如果容器内当前用户已经有权限访问目标文件,可以去掉
sudo,避免因为没有sudo权限或者sudo需要密码导致执行失败。 - 也可以用bash内置的
[命令代替test,写法是:"sudo [ -f /repositories/gubbins/file.txt ] && echo true",效果完全一样。 - 确保容器内存在
bash和sudo命令,如果容器是基于alpine等轻量镜像,可能需要用/bin/sh代替/bin/bash。
内容的提问来源于stack exchange,提问作者mJ222398
相关产品推荐
相关产品推荐

