繁体   English   中英

从 Windows 调度程序调用时,Powershell 触发 ACR BUILD 失败

[英]Powershell to trigger ACR BUILD failing when called from windows scheduler

我一直在尝试使用 Powershell 在机器上安排 ACR BUILD。 我使用的方法是使用服务主体(如下所示: https ://docs.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli)

如果我在 Powershell 控制台中调用它,我已经创建了一个可以正常工作的构建脚本。 但是,当我安排脚本从 Windows 调度程序运行时,它似乎跳过了 ACR BUILD 部分并且没有按预期执行。

下面的脚本:

$myreg = "myreg"
$myregfull = "myreg.azurecr.io"
$Date = Get-Date -format "yyyyMMdd"
$logfile = "c:\Log-$Date.txt"
$user ="xxx"
$pass="xxx"
$tenant="xxx"
$subscription="xxx"
$myimage="myimage:"

Try {
    # 1. Logging in as service principal
    $DateForLog = Get-Date | Out-File -FilePath $logfile -Append
    "--- Logging in as service principal ---" | Out-File -FilePath $logfile -Append
    az login --service-principal -u $user -p $pass --tenant $tenant  | Out-File -FilePath $logfile -Append
}
Catch{
    "Logging in as service principal failed at $(Get-Date). Error: $($_.Exception.Message)" | 
        Out-File -FilePath $logfile -Append
}

Try {
    # 2. Switching to subscription
    $DateForLog = Get-Date | Out-File -FilePath $logfile -Append
    "--- Switching to subscription ---" | Out-File -FilePath $logfile -Append
    az account set --subscription $subscription | Out-File -FilePath $logfile -Append
}
Catch{
    "Switching to subscription failed at $(Get-Date). Error: $($_.Exception.Message)" | 
        Out-File -FilePath $logfile -Append
}

Try {
    # 3. Logging in to registry
    $DateForLog = Get-Date | Out-File -FilePath $logfile -Append
    "--- Logging in to registry $myreg.azurecr.io ---" | Out-File -FilePath $logfile -Append
    $TOKEN=$(az acr login --name $myreg --expose-token --output tsv --query accessToken)
    docker login $myregfull -u 00000000-0000-0000-0000-000000000000 -p $TOKEN | Out-File -FilePath $logfile -Append
}
Catch{
    "Logging in to registry failed at $(Get-Date). Error: $($_.Exception.Message)" | 
        Out-File -FilePath $logfile -Append
}

Try {
    # 4. Confirm connected
    $DateForLog = Get-Date | Out-File -FilePath $logfile -Append
    "--- Confirming connected ---" | Out-File -FilePath $logfile -Append
    az acr show -n $myreg | Out-File -FilePath $logfile -Append
    az acr repository list -n $myreg | Out-File -FilePath $logfile -Append
}
Catch{
    "Confirm connected failed at $(Get-Date). Error: $($_.Exception.Message)" | 
        Out-File -FilePath $logfile -Append
}

Try {
    # 5. Triggerng Build
    $DateForLog = Get-Date | Out-File -FilePath $logfile -Append
    "--- Triggering build of myreg.azurecr.io/myimage:initial ---" | Out-File -FilePath $logfile -Append
    az acr build -t $myimage$Date -r $myreg . --platform windows | Out-File -FilePath $logfile -Append
}
Catch{
    "Triggerng Build failed at $(Get-Date). Error: $($_.Exception.Message)" | 
        Out-File -FilePath $logfile -Append
}

$DateForLog = Get-Date | Out-File -FilePath $logfile -Append

当从控制台调用时,日志显示调用的命令,然后大约 15 分钟后(上下文上传后)显示(等)。 : 2022/06/14 10:26:12 正在下载源代码...然后在进入下一步之前大约需要 30 分钟来构建。

而当调用表单调度程序时,它显示该步骤在 8 秒内完成。

不过,登录过程肯定是成功的,因为无论在哪里调用表单,都会显示存储库列表。

任何有关可能导致此问题的建议将不胜感激。

编辑更新问题以显示日志。

从调度程序:

14 June 2022 14:46:05
--- Logging in as service principal ---
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "xxx",
    --- OMMITTED ---
    "user": {
      "name": "xxx",
      "type": "servicePrincipal"
    }
  }
]
14 June 2022 14:46:31
--- Switching to subscription ---
14 June 2022 14:46:36
--- Logging in to registry myreg.azurecr.io ---
Logging in to registry failed at 06/14/2022 14:46:47. Error: The term 'docker' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
14 June 2022 14:46:47
--- Confirming connected ---
{
  "adminUserEnabled": true,
  "anonymousPullEnabled": false,
  "creationDate": "2021-04-06T10:23:22.985285+00:00",
  --- OMMITTED --- 
  "type": "Microsoft.ContainerRegistry/registries",
  "zoneRedundancy": "Disabled"
}
[
  "myrepo1",
  --- OMMITTED --- 
  "myrepo2"
]
14 June 2022 14:47:03
--- Triggering build of myreg.azurecr.io/myimage:initial ---
14 June 2022 14:47:12

从控制台:

14 June 2022 14:50:14
--- Logging in as service principal ---
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "xxx",
    --- OMMITTED ---
    "user": {
      "name": "xxx",
      "type": "servicePrincipal"
    }
  }
]
14 June 2022 14:50:41
--- Switching to subscription ---
14 June 2022 14:50:47
--- Logging in to registry myreg.azurecr.io ---
Logging in to registry failed at 06/14/2022 14:50:57. Error: The term 'docker' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
14 June 2022 14:50:57
--- Confirming connected ---
{
  "adminUserEnabled": true,
  "anonymousPullEnabled": false,
  "creationDate": "2021-04-06T10:23:22.985285+00:00",
  --- OMMITTED --- 
  "type": "Microsoft.ContainerRegistry/registries",
  "zoneRedundancy": "Disabled"
}
[
  "myrepo1",
  --- OMMITTED --- 
  "myrepo2"
]
14 June 2022 14:51:11
--- Triggering build of myreg.azurecr.io/myimage:initial ---
2022/06/14 14:51:23 Downloading source code...
2022/06/14 14:51:29 Finished downloading source code
2022/06/14 14:51:30 Using acb_vol_77064302-024f-4c7c-8933-8f1fc9a4ce4f as the home volume
2022/06/14 14:51:31 Setting up Docker configuration...
2022/06/14 14:51:38 Successfully set up Docker configuration
2022/06/14 14:51:38 Logging in to registry: myreg.azurecr.io
2022/06/14 14:51:42 Successfully logged into myreg.azurecr.io
2022/06/14 14:51:42 Executing step ID: build. Timeout(sec): 28800, Working directory: '', Network: ''
2022/06/14 14:51:42 Scanning for dependencies...
2022/06/14 14:51:46 Successfully scanned dependencies
2022/06/14 14:51:46 Launching container with name: build

Sending build context to Docker daemon  804.4kB
Step 1/7 : FROM myreg.azurecr.io/myimage:empty
empty: Pulling from myimage
4612f6d0b889: Pulling fs layer
5ff1512f88ec: Pulling fs layer
--- OMMITTED ---

问题是 ACR BUILD 命令需要 docker 文件的绝对文件路径以及 <SOURCE_LOCATION>。

从控制台调用时,会采用当前位置,但从调度程序调用脚本时,它需要是绝对的。

所以而不是:

az acr build -t $myimage$Date -r $myreg . --platform windows

它必须是:

az acr build -t $myimage$Date -r $myreg -f c:/path-to-docker-file c:/path-to-source-folder/ --platform windows

开始时这并不明显的原因是因为我捕获日志的方式。 将输出从 ACR BUILD 传送到Out-File -FilePath $logfile时,没有给出错误或警告。

只有当我切换到创建会话记录(并删除管道输出)时,才会显示关于无法看到 dockerfile 的错误。

Start-Transcript -Path "E:\transcript.txt" -NoClobber

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM