2017-03-22 77 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”)

我希望它能帮助