2017-03-17 65 views
2

介紹

大家好,我成立了一個泊塢窗機在Azure中使用以下指南:刪除未使用的碼頭工人圖像託管碼頭工人實例給出了「未知速記標誌:‘A’在-aq」錯誤

我設法讓這一切工作,並在Windows上做一個構建,當我現在可以使用鋰nux Docker Host從創建的源創建docker鏡像。 (只需使用「泊塢窗:建立一個像」步驟,然後由「泊塢窗:推圖像」的步驟設置爲我的Linux構建機器的DockerHostConnnection:

Build steps for docker image in Azure

這個過程卻留下創建的圖像。在磁盤上

我想下一步要做的就是創建一個每晚構建是清理圖片我基本上創建了一個新的版本,並增加了以下步驟:

  1. 顯示搬運工圖像前:(泊塢窗圖片-a)
  2. 泊塢信息:(泊塢窗資訊)
  3. 刪除泊塢窗圖片:(泊塢窗RMI $(搬運工圖像-aq))
  4. 泊塢窗顯示影像後:(搬運工圖像-a)

問題

每當我運行此版本,雖然我似乎收到以下錯誤:

Error docker -a

奇怪的是雖然是命令「泊塢窗圖像-aq」中的步驟之前,工作得很好:

docker images -aq works fine

調查

我開始做從手動拉開指令一番調查我自己的電腦遠程主機泊塢窗,但我遇到了同樣的問題有以下.cmd文件:

docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' login -u ********** -p ********** ********** 
docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' images -aq 
docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' rmi $(docker images -a) 
docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' logout ********** 

此.cmd文件的結果:

Results of .cmd file

噹噹地從.CMD我看到了同樣的錯誤運行它:

Local cmd

從PowerShell中運行它,它的工作原理雖然罰款:

PowerShell works fine

編輯。 ..(經過更多調查)

使用這些知識,我將.cmd文件修改爲似乎效果更好一點的.ps1文件。一個問題是,$(docker ....)從本地docker安裝中獲取了它的信息。我改變了腳本以下,現在它從我的本地機器的工作方式與Azure中的Linux泊塢窗主持人:

docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' login -u ********** -p ********** ********** 
docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' images -a 
docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' rmi -f $(docker -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' images -aq) 
docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' logout ********** 

所以基本上這個然而現在的工作,我怎麼能得到這個與Azure的泊塢構建步驟工作?

因爲基本上似乎有兩個問題與天青多克爾整合步驟:

  1. 我想中的命令CMD而不是PowerShell的,這導致-a錯誤
  2. 在做類似運行: 'docker -H .... rmi $(docker images -aq)',第二個docker命令(docker images ...)將與本地docker實例進行通信。所以我實際上喜歡這個解決方案,而不必手動提供IP地址和所有證書。 (如果找不到好的解決方案,我可以用哈克的方式解決這個問題)

回答

0

我已經修改了多克爾VSTS任務,支持的輸出命令,使鏈接多個泊塢窗命令是可能的。

我已經創建與該一個Github上儲存庫並提交了拉請求: https://github.com/devedse/vsts-docker

在下面的例子中,我使用的輸出變量來首先獲得多克爾圖像,然後將其刪除。使用VSTS中剛剛發佈的條件任務的功能,我還設法讓VSTS生成,只要沒有找到圖像,就跳過「刪除圖像」步驟。

獲取泊塢窗圖片:

Obtaining the Docker images

卸下泊塢圖像,如果有任何發現

Removing the Docker images if there are any found

0

此任務不允許將一個命令輸出到另一個命令。如果我們把輸入ps -aqf「status = exited」| ForEach-Object {docker rm -vf $ _}在任務中輸入其實際運行的 child_process.spawn(<路徑到docker exe>,ps -aqf「status = exited」| ForEach-Object {docker rm -vf $ _} )

整個輸入作爲參數傳遞給docker.exe,因此在同一任務中將輸出重定向到另一個可執行文件是不可能的。即使在任務中運行另一個可執行文件也不可能。這可能是出於安全原因而設計的。

與簡單的cmd行相同。不允許輸出輸出,並且整個「-aqf」狀態=退出「| ForEach-Object {docker rm -vf $ _}」作爲參數傳遞給docker.exe

+0

我明白,這目前可能是這種情況。雖然這不能解決問題,但我正在尋找一種很好的解決方法,或者可能需要對Docker集成步驟的當前方式進行更改。基本上,您希望能夠像在Linux/PowerShell中一樣將命令鏈接在一起。 – Devedse

0

它作爲命令行運行, t支持命令嵌套,您可以改爲使用Shell腳本任務。

類似的線程:Command nesting in VSTS/TFS