好的,所以我尝试了很多,最终找到了一个解决方案,允许我通过TeamCity构建步骤检查Docker是否正在运行,如果没有,则成功启动它。
1.)以提升的本地帐户运行TeamCity构建代理服务
SYSTEM
账户我使用以下方式将其切换到管理员帐户:
Services
â³TeamCity Build Agent
â³Log On>Log on as
â³âThis account: .\Administrator
2.)使用不依赖于try catch的“干净”skcript来查看Docker是否正在运行
我现在使用的最后一个PowerShell脚本非常有效,如下所示:
# This File checks if docker is running, and starts it if necessary, waiting until it has finished starting up before exiting
# ---------
# VARIABLES
# ---------
$TimeoutInterval = 10 #Timeout interval for checking whether docker has finished starting, in seconds
$DockerPath = "C:\Program Files\Docker\Docker\Docker for Windows.exe"
# ---------
# FUNCTIONS
# ---------
Function ProcessRunning([string] $ProcessName) {
[bool] $Return = $False
if ( Get-Process | Where-Object {$_.Name -like $ProcessName} ) {
$Return = $True
}
Return $Return
}
# Determines if a Service exists with a name as defined in $ServiceName.
Function ServiceExists([string] $ServiceName) {
[bool] $Return = $False
if ( Get-Service "$ServiceName*" -Include $ServiceName ) {
$Return = $True
}
Return $Return
}
# Determines if a Service with a name as defined in $ServiceName exists and is running
Function ServiceRunning([string] $ServiceName) {
[bool] $Return = $False
Write-Host "Checking if Service "$ServiceName" exists and is running"
Write-Host ""
if ( Get-Service "$ServiceName*" -Include $ServiceName ) {
$arrService = Get-Service -Include $ServiceName
if ( $arrService.Status -eq "Running" ) {
Write-Host "Service "$ServiceName" exists, and is running!"
Write-Host ""
$Return = $True
}else{
Write-Host "Service "$ServiceName" exists, but is not running!"
Write-Host ""
}
}else{
Write-Host "Service "$ServiceName" does not exist!"
Write-Host ""
}
Return $Return
}
# -------
# PROGRAM
# -------
if(ProcessRunning("Docker for Windows")){
Write-Host "Docker is running"
Write-Host ""
docker version
}else{
Write-Host "Docker is not running"
Write-Host ""
Write-Host "Starting Docker"
Write-Host ""
Start-Process $DockerPath
#Waits while Docker has not finished starting up
$dockerStarting = $true
while($dockerStarting){
if((ServiceRunning("com.docker.service")) -and (ServiceRunning("docker"))){
Write-Host ""
Write-Host "Docker has finished starting up!"
Write-Host ""
docker version
$dockerStarting = $false
}else{
Write-Host ""
Write-Host "Docker is still starting up..."
Write-Host ""
#Attempts to start the relevant services
if(!(ServiceRunning("com.docker.service"))){
if(ServiceExists("com.docker.service")){
Start-Service "com.docker.service"
}
}
if(!(ServiceRunning("docker"))){
if(ServiceExists("docker")){
Start-Service "docker"
}
}
$dockerStarting = $true
Wait-Event -Timeout $TimeoutInterval
}
}
}
我仍然不知道为什么try catch在TeamCity不起作用,所以如果有人知道答案,请发表评论。
无论如何,我希望这个解决方案对某些人有所帮助。