Docker中用.NET客户端运行AzCopy报错,求正确配置参数
解决.NET Docker Client运行AzCopy时的控制台异常问题
这个异常的根源是AzCopy的交互式进度条功能在Docker容器的TTY环境配置异常时出错了——从栈追踪能看到,它在尝试更新控制台光标位置的进度文本时,因为无法获取有效的终端窗口尺寸,导致字符串截取的length参数为负数,最终抛出了ArgumentOutOfRangeException。
结合你用Docker CLI能正常运行的情况,这里有几个可行的解决方案:
方案1:禁用TTY(推荐,匹配CLI无-it的成功场景)
Docker CLI不加-it运行时,默认不会分配TTY,AzCopy会自动切换到非交互式模式,用普通的日志输出代替动态进度条,避开了触发错误的控制台交互逻辑。你只需要修改.NET客户端的容器创建参数,把Tty设为false即可:
var container = await client.Containers.CreateContainerAsync(new CreateContainerParameters { Hostname = "", Domainname = "", User = "", AttachStdin = false, AttachStderr = true, AttachStdout = true, Tty = false, // 关键修改:关闭TTY Volumes = ... Image = ... Cmd = arguments, HostConfig = new HostConfig { LogConfig = new LogConfig { Type = "json-file" }, AutoRemove = false, Binds = binds } });
方案2:如果需要保留TTY,补充标准输入配置
如果你确实需要使用TTY(比如有交互式操作需求),需要同时开启OpenStdin(对应Docker CLI的-i参数),确保TTY能正确初始化终端环境:
var container = await client.Containers.CreateContainerAsync(new CreateContainerParameters { Hostname = "", Domainname = "", User = "", AttachStdin = true, // 打开标准输入附加 AttachStderr = true, AttachStdout = true, Tty = true, OpenStdin = true, // 添加此参数,对应CLI的-i Volumes = ... Image = ... Cmd = arguments, HostConfig = new HostConfig { LogConfig = new LogConfig { Type = "json-file" }, AutoRemove = false, Binds = binds } });
方案3:直接禁用AzCopy的进度输出
你也可以在AzCopy的命令参数中添加--quiet,强制禁用所有进度相关的控制台交互,这样不管容器的TTY配置如何,都不会触发那个错误的逻辑:
azcopy --source /data1/S2B_MSIL2A_20180107T102359_N0206_R065_T33UUB_20180107T121759.SAFE --destination https://eodata.blob.core.windows.net/test --dest-key --recursive --quiet
这三个方案里,方案1最贴合你用Docker CLI成功运行的场景,应该能最快解决问题。
内容的提问来源于stack exchange,提问作者Poul K. Sørensen
相关产品推荐
相关产品推荐

