2015-09-16 51 views
85

我的碼頭圖像建立在Jenkins CI服務器上,並被推送到我們的私人碼頭註冊表。我的目標是配置docker-compose環境,它始終啓動圖像的原始狀態。如何讓docker-compose始終從新鮮圖像重新創建容器?

我目前在不同的機器上使用docker-compose 1.3.2和1.4.0,但我們以前也使用過舊版本。

我總是使用docker-compose pull && docker-compose up -d命令從註冊表中獲取新圖像並啓動它們。我相信我的首選行爲在某個特定時間點按預期工作,但自此docker-compose up開始重新運行先前停止的容器,而不是每次啓動原始構建的圖像。

有沒有辦法擺脫這種行爲?那麼可以通過docker-compose.yml配置文件連接到每次調用時不依賴於「不會忘記」命令行上的內容?

ps。除了找到實現我的目標的方法之外,我還想更多地瞭解這種行爲的背景。我認爲Docker的基本思想是構建一個不可變的基礎架構。目前Docker-compose的行爲似乎與這種方法發生了明顯的衝突......或者我在這裏錯過了一些觀點?

回答

101

docker-compose up --force-recreate是一種選擇,但如果您將它用於配置項,我將以docker-compose rm -f開始構建,以停止並移除容器和容器(然後按照上拉和後續操作)。

這是我使用:

docker-compose rm -f 
docker-compose pull 
docker-compose up --build -d 
# Run some tests 
./tests 
docker-compose stop -t 1 

容器重建的原因是爲了保護可能被使用的任何數據卷(它也恰好使up快很多)。

如果你正在做CI你不想這樣做,所以只是刪除一切應該讓你想要你想要的。

更新:使用up --build這是在docker-compose 1.7

+1

是的,其實這也是我在CI中所做的。不知道爲什麼我沒有提到... –

+0

@dnephin'碼頭合成運行-d'不存在?你想說'docker-compose up -d'no? –

+1

如果您在'''docker-compose rm -f'''之前運行'''docker-compose pull''',您可以節省更多時間 – stephanlindauer

12

您可以將--force-recreate傳遞給docker compose up,它應該使用新鮮的容器。

我認爲重複使用容器的原因是在開發過程中保留任何更改。請注意,Compose與卷類似,它也將在容器重新創建(重新創建的容器將附加到其前一卷)之間持續存在。例如,如果將Redis容器用作緩存,並且每次進行小的更改時都不想丟失緩存,則這會很有幫助。在其他時候,這只是令人困惑。

我不相信有什麼辦法可以強制這從撰寫文件。

可以說它確實與不可變的基礎架構原則相沖突。反說法可能是您在生產(尚)中不使用Compose。另外,我不確定我是否同意不可變的基礎是Docker的基本概念,儘管它肯定是一個很好的用例/賣點。

+0

感謝您的回答。我認爲在配置層面強制它是非常有用的,例如。強制它爲一個數據庫容器,並禁用應用程序容器默認情況下的重新創建.. –

+3

'--force-recreate'不適用於我...即使有更新的版本,圖像也不會被拉出... – lisak

+0

@lisak我從來沒有說過它拉動新的圖像。它沒有。它只是使用本地可用的任何圖像啓動新的容器。你需要手動運行docker pull。 –

-2
$docker-compose build 

添加如果有新的東西將被重建。

34

爲我工作唯一的解決辦法是這樣的命令:

docker-compose build --no-cache 

這將自動從回購拉清新的形象,也不會使用的預生成與您一直在使用之前的任何參數緩存版本。

13

通過目前的官方documentation存在是阻止和清除容器,網絡容量和圖像通過了創建的,如果他們已經停止或部分切除等,那麼它會做的伎倆太捷徑:

docker-compose down 

然後,如果你對你的圖像或Dockerfiles新的變化使用:

docker-compose build --no-cache 

最後:docker-compose up

在一個命令中: docker-compose down && docker-compose build --no-cache && docker-compose up