2017-03-22 74 views
0

我是Docker的新手。我寫這造成2個容器,酒吧泊塢窗,撰寫文件,共享卷數據env文件命名卷在docker-composose

services: 

    foo: 
     container_name: foo 
     build: ./foo 
     volumes: 
      - data:/var/lib/ 

    bar: 
     container_name: bar 
     build: ./bar 
     volumes: 
      - data:/var/lib/ 
     depends_on: 
      - foo 

volumes: 
    data: 

現在,我想使用環境變量TAG,標記容器和容量,以指定是否爲測試生產。我希望這樣的事情:

services: 

    foo: 
     container_name: foo_${TAG} 
     build: ./foo 
     volumes: 
      - data_${TAG}:/var/lib/ 

    bar: 
     container_name: bar_${TAG} 
     build: ./bar 
     volumes: 
      - data_${TAG}:/var/lib/ 
     depends_on: 
      - foo 

volumes: 
    data_${TAG}: 

顯然,碼頭工人,撰寫是因爲含有data_${TAG}:的最後一行的不滿。

如何命名我的音量與TAG env變量?

+0

您可以預先創建您的卷(又名撰寫外部卷)嗎?如果是這樣,有一個簡單的解決方案。 – BMitch

+0

其中一個卷是Apache日誌文件,所以我認爲我無法提前創建它們。你的解決方案是什麼? – roipoussiere

回答

1

如果事先創建卷,您可以使用這樣的外部卷名變量(注意,撰寫的內部參考是一個固定的名字,但它指向一個變量的外部卷名):

$ cat docker-compose.volvar.yml 
version: '2' 

volumes: 
    data: 
    external: 
     name: test-data-${TAG} 

services: 
    source: 
    image: busybox 
    command: /bin/sh -c 'echo From ${TAG} >>/data/common.log && sleep 10m' 
    environment: 
    - TAG 
    volumes: 
    - data:/data 
    target: 
    image: busybox 
    command: tail -f /data/common.log 
    depends_on: 
    - source 
    environment: 
    - TAG 
    volumes: 
    - data:/data 

預先用docker volume create命令創建卷:

$ docker volume create test-data-dev 
test-data-dev 

$ docker volume create test-data-uat 
test-data-uat 

$ docker volume create test-data-stage 
test-data-stage 

這裏是一個運行它的例子(我沒有使用不同的目錄或者改變項目名稱,所以每次都要更換我的容器,但是我可以很容易地改變項目以同時運行所有項目並獲得相同的結果) :

$ TAG=dev docker-compose -f docker-compose.volvar.yml up -d 
Creating test_source_1 
Creating test_target_1 

$ docker logs test_target_1 
From dev 

$ TAG=uat docker-compose -f docker-compose.volvar.yml up -d 
Recreating test_source_1 
Recreating test_target_1 

$ docker logs test_target_1 
From uat 

$ TAG=stage docker-compose -f docker-compose.volvar.yml up -d 
Recreating test_source_1 
Recreating test_target_1 

$ docker logs test_target_1 
From stage 

$ # just to show that the volumes are saved and unique, 
$ # rerunning uat generates a second line 
$ TAG=uat docker-compose -f docker-compose.volvar.yml up -d 
Recreating test_source_1 
Recreating test_target_1 

$ docker logs test_target_1 
From uat 
From uat 
+0

我喜歡你的解決方案,謝謝! – roipoussiere

1

我不知道這是否可能這樣的,但這裏是我做的:

我有一個碼頭工人,compose.yml文件一樣,

services: 

    foo: 
     container_name: foo_${TAG} 
     build: ./foo 
     volumes: 
      - /var/lib/ 

    bar: 
     container_name: bar_${TAG} 
     build: ./bar 
     volumes: 
      - /var/lib/ 
     depends_on: 
      - foo 

然後我創建一個文件泊塢窗,compose.override.yml包含

services: 

    foo: 
     volumes: 
      - data_dev:/var/lib/ 

    bar: 
     volumes: 
      - data_dev:/var/lib/ 

當您啓動泊塢窗,撰寫這樣一來,它將使用主文件,並使用其他文件覆蓋它的值。

然後,您應該有3個文件:

  • 泊塢窗,compose.yml
  • 泊塢窗,compose.override-prod.yml
  • 泊塢窗,compose.override-dev.yml

然後當你建立你有2之間的選擇:

  1. (我該怎麼做)將docker-compose.override-.yml複製到docker-compose.override.yml和Docker Compose並自動帶上這兩個文件
  2. 您可以提供2個文件用於docker撰寫文件(我忘了參數是什麼...我想這是「-f」)

我希望它能幫助