在docker-compose中使用env文件命名的卷

时间:2017-03-22 13:19:57

标签: docker docker-compose

我是Docker的新手。我正在编写一个docker-compose文件,它创建了2个容器, foo bar ,共享一个卷数据

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 来标记容器和卷,以指定它是否适用于 test 生产。我期待这样的事情:

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}:的最后一行,docker-compose不满意。

如何使用 TAG env变量命名我的音量?

2 个答案:

答案 0 :(得分:1)

我不知道这是否可能,但这就是我所做的:

我有一个像这样的docker-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

然后我创建一个包含

的文件docker-compose.override.yml
services:

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

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

这样当启动docker-compose时,它将使用主文件并使用另一个文件来覆盖其值。

然后你应该有3个文件:

  • 搬运工-compose.yml
  • 搬运工-compose.override-prod.yml
  • 搬运工-compose.override-dev.yml

然后当你建立时,你可以选择那两个:

  1. (我的所作所为)我将docker-compose.override-.yml复制到docker-compose.override.yml并使用Docker Compose自动获取这两个文件
  2. 您可以提供2个文件用于docker compose文件(我忘记了参数是什么......我猜它是“-f”)
  3. 我希望它有所帮助

答案 1 :(得分:1)

如果您提前创建卷,则可以在外部卷名上使用此变量(请注意,compose中的引用是固定名称,但它指向可变外部卷名称):

$ 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
相关问题