代码之家  ›  专栏  ›  技术社区  ›  InteXX

AzCopy Sync命令失败

  •  0
  • InteXX  · 技术社区  · 4 年前

    我发出命令:

    azcopy sync "D:\Releases\Test\MyApp" "http://server3:10000/devstoreaccount1/myapp?sv=2019-02-02&st=2020-06-24T03%3A19%3A44Z&se=2020-06-25T03%3A19%3A44Z&sr=c&sp=racwdl&sig=REDACTED"
    

    …我得到了这个错误:

    有人能看出我的语法有什么不对吗?

    1 回复  |  直到 4 年前
        1
  •  1
  •   Gaurav Mantri    4 年前

    我相信您在azcopy中遇到了一个问题,即它不支持本地仿真器(至少对于sync命令)。在Github上也有一个公开的问题: https://github.com/Azure/azure-storage-azcopy/issues/554

    基本上,问题来自以下几行 code Unknown 对于存储仿真器URL:

    func inferArgumentLocation(arg string) common.Location {
        if arg == pipeLocation {
            return common.ELocation.Pipe()
        }
        if startsWith(arg, "http") {
            // Let's try to parse the argument as a URL
            u, err := url.Parse(arg)
            // NOTE: sometimes, a local path can also be parsed as a url. To avoid thinking it's a URL, check Scheme, Host, and Path
            if err == nil && u.Scheme != "" && u.Host != "" {
                // Is the argument a URL to blob storage?
                switch host := strings.ToLower(u.Host); true {
                // Azure Stack does not have the core.windows.net
                case strings.Contains(host, ".blob"):
                    return common.ELocation.Blob()
                case strings.Contains(host, ".file"):
                    return common.ELocation.File()
                case strings.Contains(host, ".dfs"):
                    return common.ELocation.BlobFS()
                case strings.Contains(host, benchmarkSourceHost):
                    return common.ELocation.Benchmark()
                    // enable targeting an emulator/stack
                case IPv4Regex.MatchString(host):
                    return common.ELocation.Unknown()//This is what gets returned in case of storage emulator URL.
                }
    
                if common.IsS3URL(*u) {
                    return common.ELocation.S3()
                }
            }
        }
    
        return common.ELocation.Local()
    }
    
        2
  •  1
  •   InteXX    4 年前

    好吧,经过了很多未来,我终于能够让这个工作,使用蓝铜矿和PowerShell。很明显,AzureCLI和AzCopy都没有在仿真下进行良好的测试。

    下面是一个可以从管道调用的粗略脚本:

    [CmdletBinding()]
    param(
      [Parameter(Mandatory)][string] $Container,
      [Parameter(Mandatory)][string] $Source
    )
    
    $Context = New-AzureStorageContext -Local
    $BlobNames = Get-AzureStorageBlob -Context $Context -Container $Container | % { $_.Name }
    $FilesToSync = gci $Source\* -Include RELEASES, Setup.exe
    $Packages = gci $Source -Filter *.nupkg
    
    $Packages | % {
      If (!($BlobNames.Contains($_.Name))) {
        $FilesToSync += $_
      }
    }
    
    $FilesToSync | Set-AzureStorageBlobContent -Context $Context -Container $Container -Force
    

    请注意,这是为我的 Squirrel 部署(*.nupkg,版本,安装程序.exe)所以一个人会想根据自己的环境做出相应的调整。

    powershell -command "Start-Process azurite-blob.cmd -PassThru -ArgumentList '--blobHost 0.0.0.0'"
    

    该参数将Azurite设置为侦听任何IP,以便可以从网络上的其他计算机访问它。我在防火墙上为10000-10002端口打了个洞。

    请小心地将任务设置为在安装Azurite时使用的同一帐户下运行,否则任务将无法看到 azurite-blob.cmd (它在里面 %AppData%\npm ,添加到 PATH

    推荐文章