原本的需求是在 Pipelines 部署時,判斷如果docker-compose 己經有把container 建起來了,就更新container,否則就用docker-compose建立新的container。
但是在Pipelines的部署工作裡,似乎要做到上面的需求有困難。所以才想要在powershell裡執行docker-compose
底下是我預備要執行的powershell,
Set-Location -Path C:\composefile
$proxy = 'iisproxy'
$site1 = 'site-blue'
$site2 = 'site-green'
$cID = $(docker ps -qf "name=$proxy")
if(-NOT $cID){
Write-Host "create new container"
docker pull myhub.local/iisproxy
docker pull myhub.local/app
docker-compose up -d
}
else {
Write-Host "update container"
docker pull myhub.local/app
docker-compose stop $site1
docker-compose up -d --force-recreate --no-deps $site1
Start-Sleep -s 5
docker-compose stop $site2
docker-compose up -d --force-recreate --no-deps $site2
}
但是卻發現只要是執行到 docker-compose 就會出現 NativeCommandError 的錯誤
2019-07-24T08:00:10.7991464Z ##[error]位於 C:\azagent\A1\_work\_temp\46980d80-fab6-4a21-8fd7-1a6e7130d9a8.ps1:20 字元:9
+ docker-compose stop $site1
2019-07-24T08:00:10.8097416Z ##[error]+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
2019-07-24T08:00:10.8204529Z ##[error] + CategoryInfo : NotSpecified: (Stopping site-blue ... :String) [], RemoteException
2019-07-24T08:00:10.8301628Z ##[error] + FullyQualifiedErrorId : NativeCommandError
2019-07-24T08:00:10.8403452Z ##[error]
2019-07-24T08:00:10.8516019Z ##[error]PowerShell 已結束,代碼為 '1'。
但是直接開啟command視窗執行是正常的。 後來又發現在Powershell ISE 裡執行指令就會有一樣的錯誤。 原來兇手是 powershell 自己,害我錯怪 docker-compose 好幾天。
自此,才有比較明確的追查方向。
找到在stackoverflow上一樣症頭的討論
原來是因為 powershell 在處理 STDERR (standard error) 有不同的行為才造成這樣的錯
照文章內的好幾個做法,要在 Pipelines裡可以正常執行要改成這樣
用 2>&1 來吃掉多出來的錯誤
&cmd /c "docker-compose up -d 2>&1"
下面是完整的script
Set-Location -Path C:\composefile
$proxy = 'iisproxy'
$site1 = 'site-blue'
$site2 = 'site-green'
$cID = $(docker ps -qf "name=$proxy")
if(-NOT $cID){
Write-Host "create new container"
docker pull myhub.local/iisproxy
docker pull myhub.local/app
&cmd /c "docker-compose up -d 2>&1"
}
else {
Write-Host "update container"
docker pull myhub.local/app
&cmd /c "docker-compose stop $site1 2>&1"
&cmd /c "docker-compose up -d --force-recreate --no-deps $site1 2>&1"
Start-Sleep -s 5
&cmd /c "docker-compose stop $site2 2>&1"
&cmd /c "docker-compose up -d --force-recreate --no-deps $site2 2>&1"
}
沒有留言:
張貼留言