2017-04-16 54 views
0

在我的CI環境有幾個內部版本,我需要得到特定的版本爲docker-composeDocker:在哪裏存儲Docker-compose的多個圖像的版本?

registry.example.com/foo/core 0.1.3 
registry.example.com/foo/core 0.2.2 
... # multiple packages in several versions like this 

圖像被建造這樣的:

build: 
    stage: build 
    script: 
    ... 
    - docker build -t $CI_REGISTRY_IMAGE:$VERSION . 
    - docker push $CI_REGISTRY_IMAGE:$VERSION 

他們被拉上部署管道像這樣:

production: 
    stage: deploy 
    script: 
    - docker pull $CI_REGISTRY_IMAGE:$VERSION 

我還使用docker-compose從該映像啓動所有微服務:

$ docker-compose up -d 

但現在這是我的問題。我在哪裏可以存儲應該使用哪個版本的每個圖像?硬編碼它看起來像這樣 - 但是這將始終啓動0.2.2,雖然部署管道可以拉一個不同的版本,如0.1.3:

core: 
    container_name: core 
    image: 'registry.example.com/foo/core:0.2.2' 
    restart: always 
    links: 
    - 'mongo_live' 
    environment: 
    - ROOT_URL=https://example.com 
    - MONGO_URL=mongodb://mongo_live/example 

但版本應該更好地設置爲一個變量。所以我會認爲在部署我必須存儲當前的$VERSION值。在運行docker-compose應讀取版本值以獲取正確的版本,因爲最新版本並不總是選定的版本。

回答

0

如果您將它作爲變量傳遞,您可以將其存儲在您定義CI環境中的環境變量的位置。您也可以將這些值存儲在.envdescribed here中。

使用環境中定義(或.env文件)的變量將會在docker-compose.yml這樣一行:

image: registry.example.com/foo/core:${VERSION} 

就個人而言,我會採取不同的方法,讓註冊服務器維護的版本帶有標籤的圖像。如果您有3個版本的開發,舞臺和產品,您可以構建您的registry.example.com/foo/core:0.2.2,然後標記與registry.example.com/foo/core:dev相同的圖像。後端映像校驗和可以被多個標記引用,而不會佔用註冊表服務器或docker主機上的額外磁盤空間。然後在您的開發環境中,您只需執行docker-compose pull && docker-compose up -d即可獲取開發圖像並將其旋轉起來。這種方法唯一的缺點是標籤掩蓋了當前正在使用哪個版本的圖像dev,因此您需要以其他方式進行跟蹤。

在docker中標記圖像使用docker tag命令。你可以運行:

docker tag registry.example.com/foo/core:${VERSION} registry.example.com/foo/core:dev 
docker push registry.example.com/foo/core:${VERSION} 
docker push registry.example.com/foo/core:dev 

如果註冊表已經有一個標記爲registry.example.com/foo/core:dev它就會用新的標籤指向新的圖片ID替換。

+0

如何標記現有圖像與第二個?例如0.2.2也應該得到'當前'標籤。如果我想給另一個版本加上當前的標籤,會發生什麼情況,比如說0.2.3應該是'current',但是然後0.2.2應該會鬆動'current'標籤... – user3142695

+0

我已經用docker更新了這個問題標籤「命令。當你創建一個標籤時,你正在創建一個指向圖像ID的指針。如果該標籤已經存在(本地運行標籤命令,或者遠程運行push命令時),現有標籤將被替換。您需要在目標主機上拉取圖像,以便對該主機上的此標記進行任何更改,並且'docker-compose up -d'知道圖像是否發生了變化,並且將重新創建具有正在使用的舊圖像的任何容器。 – BMitch

相關問題