You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:48:21